0

是否有任何替代方法可以使用tagUIView 的属性?问题是我想通过UITextField一些NSInteger。做法是tag。但我想通过 2 个不同的NSInteger.

有任何想法吗?

4

3 回答 3

3

您可以继承 UITextField 并将两个 NSInteger 属性添加到该类。

@interface CustomTextField : UITextField

@property (nonatomic, assign) NSInteger x;
@property (nonatomic, assign) NSInteger y;

@end
于 2012-04-04T03:12:12.323 回答
2

您可以使用关联引用将任何数据附加到任何对象。这是一个非常方便的方法。它甚至可以正确处理内存管理。我有时会使用一个类别来包装这些,这样我就可以在现有类上创建新属性。例如,在一个项目中,我希望每个视图控制器都知道一个特殊的标签(比如他们都知道的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

您可以在第 3 章UIAlertView的 iOS5:PTL 示例代码中找到一个使用 a 的简单工作示例。

于 2012-04-04T03:20:19.510 回答
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]);
}

注意事项:

  1. @RobNapier 的回答更笼统、更正确。这种方式的唯一优点是它又快又脏
  2. 适用于小于 32k 的无符号整数对
  3. 作品 NSInteger 实现> = 32位,我认为这是无处不在的。
于 2012-04-04T04:17:14.850 回答