【问题标题】:Access Variable Dynamically动态访问变量
【发布时间】:2015-01-28 05:37:28
【问题描述】:

我有很多这样命名的按钮:

@property (weak, nonatomic) IBOutlet UIButton *Round1Num1;
@property (weak, nonatomic) IBOutlet UIButton *Round1Num2;
@property (weak, nonatomic) IBOutlet UIButton *Round1Num3;
@property (weak, nonatomic) IBOutlet UIButton *Round1Num4;

@property (weak, nonatomic) IBOutlet UIButton *Round2Num1;
@property (weak, nonatomic) IBOutlet UIButton *Round2Num2;
@property (weak, nonatomic) IBOutlet UIButton *Round2Num3;
@property (weak, nonatomic) IBOutlet UIButton *Round2Num4;

等等。

我想知道是否可以使用stringWithFormat 或类似方法动态访问它们。

示例(如果代码错误,请见谅!):

我可以打电话给self.[NSString stringWithFormat:@"Round%dNum%d", 1, 1],而不是self.Round1Num1

【问题讨论】:

    标签: ios objective-c nsstring naming-conventions dynamic-variables


    【解决方案1】:

    你可以使用-performSelector::

    NSString *round2Num1ButtonAccessorSelectorStr = [NSString stringWithFormat:@"Round%dNum%d", 2, 1];
    SEL selector = NSSelectorFromString(round2Num1ButtonAccessorSelectorStr);
    if ([self respondsToSelector:selector])
        UIButton *round2Num1Button = [self performSelector:selector];
    

    对于上下文,[self performSelector:@selector(someSelector)] 本质上等同于解析为[self someSelector]self.someSelector(在属性访问器的情况下)。所有案例实际上都调用了相同的运行时函数,objc_msgSend(self, someSelector)

    特别是在这种情况下,我们正在创建一个局部变量,该变量指向由 VC 实例上的相应 IBOutlet 属性隐藏的相同引用。如果该属性不存在,那么选择器(很可能)也不存在,因此您需要通过-respondsToSelector: 防止无法识别的选择器异常。

    【讨论】:

    • 所以在这个例子中,调用round2Num1Button.tag 与调用self.Round2Num1.tag 是一样的,对吗?
    • 我也收到此错误:ARC 不允许将 Objective-C 指针隐式转换为“SEL”。我认为您的意思是使用 NSSelectorFromString 而不是 NSStringFromSelector
    • 哎呀,我的阅读障碍。应该是NSSelectorFromString。另外,回答你的第一个问题,是的——它们指向同一个对象引用。
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2012-11-22
    • 2017-06-21
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多