0

У меня есть много кнопок, названных так:Доступ к переменному Динамически

@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.Round1Num1 я мог бы назвать self.[NSString stringWithFormat:@"Round%dNum%d", 1, 1]

ответ

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).

В этом контексте мы создаем локальную переменную, которая указывает на ту же ссылку, которая скрыта соответствующим свойством IBOutlet в экземпляре VC. Если свойство не существует, то и селектор (скорее всего) не будет, поэтому вам необходимо защитить от непризнанного исключения селектора через -respondsToSelector:.

+0

Итак, в этом примере вызов round2Num1Button.tag будет таким же, как вызов self.Round2Num1.tag, правильно? – Jacob

+0

Я также получаю эту ошибку: Неявное преобразование указателя Objective-C в 'SEL' запрещено ARC. Я думаю, вы хотели использовать NSSelectorFromString вместо NSStringFromSelector – Jacob

+0

Упс, дислексический с моей стороны. Должно быть 'NSSelectorFromString'. Кроме того, чтобы ответить на ваш первый вопрос, да, они указывают на одну и ту же ссылку на объект. – John