动态访问变量
Access Variable Dynamically
我有很多这样命名的按钮:
@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
你可以使用 -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:
.
来防止无法识别的选择器异常
我有很多这样命名的按钮:
@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
你可以使用 -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:
.