ios - 动态访问变量

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

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

@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: 来防止无法识别的选择器异常。

关于ios - 动态访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28185370/

相关文章:

ios - 像 NSNumber 这样的 NSString stringWithFormat 的装箱

objective-c - 有没有办法从 NSString 构建一个函数?

iphone - 在 iPhone 上缓存整个网页

c++ - Cocos2d C++ 等效于 objective-c 函数 CCCallBlock actionWithBlock

ios - 带有标识符的应用程序ID不可用。请输入其他字符串

objective-c - 从 Objective-C 使用 FFmpeg XCFramework,找不到 header

ios - 对象是 NSMutableDictionary 的子类,但在 mutate 方法 (NSJSONSerialization) 上崩溃

ios - 在初始化期间存储到 NSString 的值永远不会被读取

ios - 将项目从 Objective C 移动到 Swift 时,类型 'AnyHashable' 的值没有下标

ios - 填充 NSArray Json 数据