view.tag仅存储NSInteger值。
那么,如何使用NSString Value识别每个视图?
不可用?
一些例子:
view0.stringTag = @"basic";
view1.stringTag = @"advanced";
答案 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)
// 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;
答案 8 :(得分:-3)
如果你想比较NSStrings,
if([view0.stringTag isEqualToString:@"basic"]){
//
}
就像
一样if(view0.tag==0){
//
}
其中stringTag是要在视图中定义的NSString变量,并指定要比较的值