对于UIView的属性,是否有任何替代方法可以使用tag
?问题是我想通过UITextField
一些NSInteger
。要做的是tag
。但我想传递2个不同的NSInteger
。
有什么想法吗?
答案 0 :(得分:3)
您可以继承UITextField并向该类添加两个NSInteger属性。
@interface CustomTextField : UITextField
@property (nonatomic, assign) NSInteger x;
@property (nonatomic, assign) NSInteger y;
@end
答案 1 :(得分:2)
您可以使用Associative Reference将任何数据附加到任何对象。这是一种非常方便的方法。它甚至可以正确处理内存管理。我有时会使用一个类别来包装它们,因此我可以在现有类上创建新属性。例如,在一个项目中,我希望每个视图控制器都能了解一个特殊的标签(比如他们都知道navigationController
)。我是这样做的:
@interface UIViewController (MYSpecialViewController)
@property (nonatomic, readwrite, strong) UILabel *specialLabel;
@end
@implementation UIViewController (MYSpecialViewController)
static const char kMySpecialLabelKey;
- (UILabel *)specialLabel
{
return objc_getAssociatedObject(self, &kMySpecialLabelKey);
}
- (void)setSpecialabel:(UILabel *)value
{
objc_setAssociatedObject(self, &kMySpecialLabelKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
您可以在iOS5中使用UIAlertView
找到一个简单的工作示例:Chapter 3的PTL示例代码。
答案 2 :(得分:1)
采用面向对象的通用解决方案,但请记住,您可以在标签中添加大量数据:
- (uint32_t)pack:(uint16_t)a with:(uint16_t)b {
return (uint32_t)(a << 16 | b);
}
- (uint16_t)getA:(uint32_t)pair {
return (uint16_t)((pair & 0xffff0000) >> 16);
}
- (uint16_t)getB:(uint32_t)pair {
return (uint16_t)(pair & 0xffff);
}
// use it
- (void)setupSomeView {
someView.tag = [self pack:1024 with:2048];
}
- (IBAction)someControlEventHappened:(id)sender {
NSLog(@"%d %d", [self getA:sender.tag], [self getB:sender.tag]);
}
注意事项: