2015-01-26 2 views
0

У меня есть класс Objective C со свойствами:Цель C: Есть ли способ перечислить свойства в коде?

@property (weak, nonatomic) IBOutlet UILabel *labelText1; 
@property (weak, nonatomic) IBOutlet UILabel *labelText2; 
@property (weak, nonatomic) IBOutlet UILabel *labelText3; 
@property (weak, nonatomic) IBOutlet UILabel *labelText4; 
@property (weak, nonatomic) IBOutlet UILabel *labelText5; 
@property (weak, nonatomic) IBOutlet UILabel *labelText6; 

Есть ли способ, чтобы перечислить его в коде? Что-то вроде:

for (int i = 1; i <= 6; i++) 
{ 
    theCell.labelText i.text = @"some value"; 
} 

Спасибо!

+2

Для конкретного примера, приведенного выше, я бы просто использовал коллекцию розетки вместо розетки для отдельных UILabels. Затем вы можете перебирать все метки через коллекцию розетки, которая будет представлять собой массив UILabels – user3435374

ответ

0

Да, но я бы не рекомендовал использовать его в реальном приложении. Целевое время объектива-C довольно открыто: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/index.html

Существует несколько методов, которые предоставят вам свойства.

+0

Спасибо! Я совершенно новичок в объективе-C. Не могли бы вы объяснить, почему это плохая идея? Мне это интересно, потому что я написал код, но придумал, что он будет выглядеть лучше с автоматическим перечислением различных ситуаций ... – user3742622

+0

Вышеуказанные предложения намного лучше в реальных приложениях. Использование среды выполнения может оставить вас открытой для будущей версии (вряд ли сейчас, так как Swift - это будущее), где они больше не доступны. – ahwulf

1

Вы можете использовать KVC для доступа к этим свойствам.

NSArray *allProperties = @[@"labelText1", @"labelText2", @"labelText3", @"labelText4", @"labelText5", @"labelText6"]; 

for (NSString *aProperty in allProperties) { 
    UILabel *label = [theCell valueForKey:aProperty]; 
    label.text = @"some value"; 
} 

Это даст вам результат, который вы хотите. Во всяком случае, я предлагаю вам создать IBOutletCollection для такого элемента интерфейса или массив только тех, которые вы хотите перебирать.

+0

В случае, если кто-либо использует Swift, IBOutletCollection не поддерживается в Swift. – user965972

+1

@ user965972 Вы видели ответ здесь http://stackoverflow.com/questions/24052459/swift-iboutletcollection-equivalent. – Sandeep

1

Вы можете создать IBOutletCollection из UILabel свойства:

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

В раскадровку или .xib файл, управление-перетащить из UILabel элементов этой недвижимости.

Затем в коде вы можете выполнить следующие действия:

[self.myControllerLabels enumerateObjectsUsingBlock:^(UILabel *label, NSUInteger idx, BOOL *stop) { 
    label.text = @"some value"; 
}]; 
0

Вы можете использовать @selector() по телефону performSelector:withObject:afterDelay: на theCell и переходя в NSString в качестве объекта.

NSString *selectorName; 
for (int i = 1; i <= 6; i++) 
{ 
    selectorName = [NSString stringWithFormat:"setLabelText%i", i]; 
    [theCell performSelector:@selector(selectorName) withObject:@"some value"]; 
} 
Смежные вопросы