2015-06-10 1 views
2

В настоящее время я использую унифицированные раскадровки (с размерами). Для одного из моих взглядов разница в дизайне между wAny hAny и классами wRegular hRegular size достаточно значительна, что недостаточно ограничить ограничения для подсмотров на основе класса размера.Самый эффективный способ ссылки на 2 разных IBOutlets сразу (где каждый из них существует только для собственного класса размера)?

Упрощенный пример: У меня есть UILabel в классе wAny hAny класса «First_Name_Label». Хотя я хочу повторно использовать этот UILabel для класса wRegular hRegular size, дизайн слишком отличается, поэтому я добавляю UILabel для класса wRegular hRegular size для репликации цели «First_Name_Label», и я называю это «First_Name_Label 2». «First_Name_Label» устанавливается только в класс wAny hAny size, а «First_Name_Label 2» установлен только в классе wRegular hRegular.

В моем коде, я хочу, чтобы задать текст для метки:

self.First_Name_Label.text = "my first name" 

Но мне нужно сделать это для другого размерного класса, а также, и мой код будет выглядеть следующим образом:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomIpad) { 
    self.First_Name_Label2.text = "my first name" 
} else { 
    self.First_Name_Label.text = "my first name" 
} 

Это кажется очень громоздким, в основном удваивающим мой текущий код. Я уверен, что есть более элегантный и эффективный способ сразу ссылаться на эти 2 IBOutlets (каждый из которых относится к разному классу размера).

ответ

2

Вы не можете подключить свойство IBOutlet с более чем одного объекта.

Но вы можете использовать один и тот же тег на этих этикетках и получить к ним, как это:

(UILabel *)[self.view viewWithTag:LABEL_TAG]; 
+0

В этом случае мне не нужно было бы создавать другой IBOutlet (просто добавьте тег к другому UILabel), но будет ли viewWithTag возвращать только 1 UILabel? Значит, мне все равно придется писать отдельный код для UILabel другого класса? – mrl

+1

Нет, вам не нужно писать отдельный код, потому что только один ярлык будет доступен в заданном классе размеров. – Aura

1

Просто используйте:

УСТРОЙСТВА
self.First_Name_Label2?.text = "my first name" 
self.First_Name_Label?.text = "my first name" 

В этом случае First_Name_Label и First_Name_Label2 не являются обязательными, и если он не инициализирован код будет просто игнорировать его. использование Make они объявить в опциями класса, а также:

var First_Name_Label:UILabelView? 
var First_Name_Label2:UILabelView? 
+0

Спасибо Icaro. Моя проблема с этим была бы в том, что мне все равно потребуется написать еще одну строку кода каждый раз, когда я хочу что-то сделать с меткой (1 строка для каждой метки), хотя мне пришлось бы использовать If/else с этим. – mrl

1

Вы считаете, используя IBOutletCollection?

например.

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

В коде, вы звоните:

for (UILabel *First_Name_Label in self.First_Name_Labels) { First_Name_Label.text = "my first name"; }

Это также позволяет легко расширить возможности для более размерных классов.