有没有其他方法可以像tag
一样使用UIView的属性?事情是我想通过UITextField
一些NSInteger
。方法是tag
。但我想通过2个不同的NSInteger
。替代/类似于UIView中的标签
任何想法?
有没有其他方法可以像tag
一样使用UIView的属性?事情是我想通过UITextField
一些NSInteger
。方法是tag
。但我想通过2个不同的NSInteger
。替代/类似于UIView中的标签
任何想法?
您可以继承UITextField并将两个NSInteger属性添加到该类中。
@interface CustomTextField : UITextField
@property (nonatomic, assign) NSInteger x;
@property (nonatomic, assign) NSInteger y;
@end
您可以使用Associative Reference将任何数据附加到任何对象。这是一个非常方便的方法。它甚至可以正确处理内存管理。我有时使用一个类别来包装这些,所以我可以在现有的类上创建新的属性。例如,在一个项目中,我希望每个视图控制器都了解特殊标签(例如他们都知道navigationController
)。我做这种方式:PTL示例代码Chapter 3:
@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
找到一个简单的工作示例。
我做了几个小小的编辑,我希望你不介意。以前它会使用静态指针值,它的值为0.现在它是一个指向静态字符的指针,它将有一个有意义的地址。 – 2012-04-04 03:41:23
@SedateAlien谢谢。你完全正确。这是我引用的代码中的一个错误(所以我现在已经修复了我的产品代码)。引用的示例代码正确。正如你注意到的,这应该是一个char,而不是char *。 – 2012-04-04 03:47:12
这样做的好处是什么 - 与 - 子类化? – lnafziger 2012-04-04 04:09:14
就拿一般的,面向对象的解决方案,但要记住,你可以在东西大量的数据到一个标签:
- (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]);
}
注意事项:
+1我正要说同样的话。 :) – lnafziger 2012-04-04 03:12:30