2012-05-24 3 views
1

В моем потоке UIViewController у меня есть набор из четырех «блоков». Каждый «блок» - это UIView четыре ребенка: два UILabel, один UIImageView и один UIView. Все они создаются в построителе интерфейса и подключаются к классу с использованием IBOutlet.См. UIView по его названию в переменной

В моем классе, у меня есть соответствующие элементы:

IBOutlet UIView  *block1; 
IBOutlet UILabel  *title1; 
IBOutlet UILabel  *text1; 
IBOutlet UIImageView *image1; 
IBOutlet UIView  *separator1; 

IBOutlet UIView  *block2; 
IBOutlet UILabel  *title2; 
IBOutlet UILabel  *text2; 
IBOutlet UIImageView *image2; 
IBOutlet UIView  *separator2; 

IBOutlet UIView  *block3; 
IBOutlet UILabel  *title3; 
IBOutlet UILabel  *text3; 
IBOutlet UIImageView *image3; 
IBOutlet UIView  *separator3; 

IBOutlet UIView  *block4; 
IBOutlet UILabel  *title4; 
IBOutlet UILabel  *text4; 
IBOutlet UIImageView *image4; 
IBOutlet UIView  *separator4; 

Я получаю данные для установки в эти UIViews динамически - и всегда в наборе из четырех, так что инициализация каждого блока тоже самое. В идеале я хотел бы сделать что-то вроде этого:

Block *block; 
UIImage *img; 

for(int i=1; i<=4; i++) 
{ 
    block = [response blockNumbered:i]; 

    [<"title"+i> setText:[block getTitle]]; 
    [<"text"+i> setText:[block getText]]; 
    img = [block getImage]; 
    if(img) 
    { 
     [<"image"+i> setImage:img]; 
    } 

    [<"separator"+i> setHidden:![block needSeparator]]; 
} 

(Обратите внимание, что это упрощает код, в реальной жизни, есть намного больше к этому инициализации, ближе к 200 строкам коды для каждого из четырех блоков - но точно такая же логика.) Теперь, если бы я мог как-то ссылаться на представление, имеющее имя в строковой переменной! ..

Есть ли способ достичь этого?

P.S. Я знаю, что я могу создать все эти представления в коде как массив соответствующих представлений, но тогда мне тоже нужно будет сделать макет кода, и я предпочел бы сделать это в IB. Или есть способ объявить массив UIViews как IBOutlet и соединить каждый элемент в массиве в IB?

ответ

2

Вы можете использовать valueForKey::

[[self valueForKey:[NSString stringWithFormat:@"title%d", i]] setText:[block getTitle]]; 
+0

А-ха! Похоже, именно то, что мне нужно. Позвольте мне попробовать и вернуться к вам. –

0

Вы должны подумать о том, чтобы немного изменить свою логику и сделать ее зависимой от маркировки. Вы можете пометить все подзаголовки как subview1.tag = 1001;subview2.tag = 1002; позже, вы можете перебирать все подзаголовки по значениям тегов.

+0

Хорошо, что, безусловно, вариант - вместе с '[родительском viewWithTag: (интермедиат)]' –

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