有沒有其他方法可以像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