如何用NSString标签识别视图?

时间:2011-10-25 07:25:38

标签: iphone nsstring

view.tag仅存储NSInteger值。

那么,如何使用NSString Value识别每个视图?

不可用?

一些例子:

view0.stringTag = @"basic";

view1.stringTag = @"advanced";

9 个答案:

答案 0 :(得分:15)

stringTag上没有UIView属性。如果您需要执行此类操作,可以使用UIView上的类别并将标记存储在关联的对象中:

@interface UIView (StringTagAdditions)
@property (nonatomic, copy) NSString *stringTag;
@end

@implementation UIView (StringTagAdditions)
static NSString *kStringTagKey = @"StringTagKey";
- (NSString *)stringTag
{
    return objc_getAssociatedObject(self, kStringTagKey);
}
- (void)setStringTag:(NSString *)stringTag
{
    objc_setAssociatedObject(self, kStringTagKey, stringTag, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end

答案 1 :(得分:7)

if use ARC

#import "UIView.h"
#import <objc/runtime.h>

@implementation UIView (StringTagAdditions)
static NSString *kStringTagKey = @"StringTagKey";
- (NSString *)stringTag
{
    return objc_getAssociatedObject(self, CFBridgingRetain(kStringTagKey));
}
- (void)setStringTag:(NSString *)stringTag
{
    objc_setAssociatedObject(self, CFBridgingRetain(kStringTagKey), stringTag, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

@end

答案 2 :(得分:5)

不,你不能使用字符串。如果您的目标是代码可读性,则可以使用枚举。但是,请确保从1开始枚举,因为0是所有视图的默认标记:

typedef enum {
    vtBasic = 1,
    vtAdvanced
} ViewType;
...
view0.tag = vtBasic;

答案 3 :(得分:1)

使用restorationIdentifier

// Supposing iOS 6.0+
view0.restorationIdentifier = @"basic";
view1.restorationIdentifier = @"advanced";

答案 4 :(得分:0)

不直接支持。你当然可以创建一个C数组,一个NSArray,一个NSDictionary,或类似的东西来完成这个(与int标签一起)。

答案 5 :(得分:0)

仅当您使用stringTag属性将自己的UIView子类化时,才可以使用此选项。你这样做的原因是什么?

答案 6 :(得分:-1)

到目前为止最简单的解决方案:Link to my answer for a similar question

尝试设置UIView的辅助功能标识符属性:

UIView *view;
view.accessibilityIdentifier = @"your string here";
NSLog(@"%@", view.accessibilityIdentifier);

输出=&gt;你的字符串

此行为与“tag”属性类似,但允许您使用NSString

答案 7 :(得分:-2)

首先,你永远不会使用标签。总是这样做可能在.h文件中(最佳实践,恕我直言。):

#define MY_VIEW_A 10001
#define MY_VIEW_B 10002

然后,在创建视图时:

view0.tag = MY_VIEW_A
view1.tag = MY_VIEW_B

然后,在哪里找到视图:

UIView *viewA = [mainView viewWithTag:MY_VIEW_A]; //this will be the view0 you created.

或者,您可以定义一个哈希函数,将NSString转换为可以指定为标记的某个Integer。 E.g。

- (int) tagForName:(NSString*)name;

然后,

- (NSString*) nameForTag:(int)tag;

我留给你define the hash function

答案 8 :(得分:-3)

如果你想比较NSStrings,

if([view0.stringTag isEqualToString:@"basic"]){
  // 
}

就像

一样
if(view0.tag==0){
//
} 

其中stringTag是要在视图中定义的NSString变量,并指定要比较的值