2013-02-24 3 views
-4

У меня есть некоторые переменные, такие как vh1vh2vh3 и т. Д. Возможно ли в цикле для цикла с переменной i?Objective C переменный подсчет

Я имею в виду что-то вроде for(int i = 1; blablabla) { [[vh + i] setBackGroundColor blablabla];}

С уважением

Edit: vh1 т.д. UILabels !!!

+0

Ответ не – Ares

ответ

3

Хотя это возможно через introspection, если у вас есть такие переменные, вы можете поместить их в NSArray и получить к ним доступ с индексом.

+0

Но переменные для UILabels, так что можно поместить их в массив? – Phil

+0

Да, в 'NSArray'. – MByD

+0

У вас есть пример для меня?До сих пор я делаю 'IBOutlet UILabel * vh1;' (то же самое с другими) Как я могу поместить это в массив? – Phil

0

Вы можете получить доступ к каждому значению следующего кода.

UILabel *label1; 
UILabel *label2; 
UILabel *label3; 
NSArray *array = @[label1, label2, label3]; 
for (int i = 0; i<3; i++) { 
    [array objectAtIndex:i]; 
} 

Добавление значений в NSArray доступно для его инициализации. Если вы хотите добавить значения позже, вы можете использовать NSMutableArray.


Я изменил свой код.

UILabel *label1 = [[UILabel alloc] init]; 
UILabel *label2 = [[UILabel alloc] init]; 
UILabel *label3 = [[UILabel alloc] init]; 
NSArray *array = @[label1, label2, label3]; 
for (int i = 0; i<3; i++) { 
    UILabel *label = [array objectAtIndex:i]; 
    label.frame = CGRectMake(0, i*100, 150, 80); 
    label.text = [NSString stringWithFormat:@"label%d", i]; 
    [self.view addSubview:label]; 
} 
+0

Спасибо за все ответы. Я создаю их с помощью 'IBOutlet UILabel * vh1;' и т. Д., А затем пробую ваш путь к ним в массиве, но он не работает. 'Ожидаемый blablabla before '=' токен':/ – Phil

+0

Вы пишете этот код на viewController? Вы хотите показать UILabels на дисплее? – akiniwa

+0

Да, это приложение для iPhone, и я пишу этот код на viewController – Phil

0

Если вы загружаете UILabelsиз XIB, вы можете использовать IBOutletCollection.

Объявите свойство:

@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels; 

Теперь вы можете ссылку несколько меток в XIB на это имущество. Затем в -viewDidLoad (после загрузки XIB), ваш массив заполняется, и вы просто использовать простые for-in:

for (UILabel *label in self.labels) { 
    label.backgroundColor = ... 
} 
+0

Не работает:/'Ожидаемый атрибут свойства до 'strong '' – Phil

+0

Я копирую/вставляю эту строку в код, и она компилируется и работает. – Tricertops

1

Как отметили другие отвечающие с новым синтаксисом массива можно довольно легко построить массив всех объектов но он сохранит старые значения, даже если впоследствии вы измените значения исходных иваров. Это может быть или не быть тем, что вам нужно.

Если вы настроены на то, чтобы ваши переменные были единичными (в отличие от массивов), вы можете использовать кодирование с ключом для доступа к ним программно. Ключевое значение кодирования также известно как KVC.

Метод, который составляет valueForKey: и может использоваться как на self, так и на других объектах.

MyClass *obj = ... // A reference to the object whose variables you want to access 

for (int i = 1; i <= 3; i++) { 
    NSString *varName = [NSString stringWithFormat: @"var%d", i]; 

    // Instead of id, use the real type of your variables 
    id value = [obj valueForKey: varName]; 

    // Do what you need with your value 
} 

Существует больше о КВЦ в docs.

В интересах полноты причина этого прямого доступа заключается в том, что стандартный объект, совместимый с KVC, наследует метод класса, называемый accessInstanceVariablesDirectly. Если вы не хотите поддержать этот прямой доступ, тогда вы должны переопределить accessInstanceVariablesDirectly, чтобы он возвращал NO.

+0

' 'obj' undeclared':/ – Phil

+0

@ user1794338 Это был просто способ обращения к объекту, где у вас есть переменные. Это может быть сам, тоже отредактирует ответ. – Monolo

Смежные вопросы