Многие люди задавали аналогичный вопрос, но ответы были либо достаточно расплывчатыми, либо не в том направлении, в котором мне нужно было развиваться, поэтому я постараюсь задать этот вопрос как можно более конкретно. Контекст этого вопроса касается разработки iOS с использованием XCode 4.
У меня есть приложение, в котором я использую один и тот же виджет несколько раз. В этом простом упражнении виджет будет представлять собой красную коробку фиксированного размера с меткой вверху, которую изменит контроллер корневого представления, но вы можете себе представить, что у него много ImageView и ScrollView, и он выглядит довольно элегантно. Этот последний пункт является ключевым, потому что художественные дизайнеры, не занимающиеся программированием, хотят иметь возможность настраивать это представление глобально, не делая одно и то же снова и снова для каждой дублированной части пользовательского интерфейса.
В приложении я заменил ImageViews и ScrollViews, которые использовались для создания виджета, одним UIView, а с помощью InterfaceBuilder установил для Custom Class значение Widget
. У меня есть выходы в корневом контроллере представления для этих объектов Widget, которые правильно подключены. Класс Widget является подклассом UIView, а его код выглядит следующим образом:
@interface Widget : UIView {
UILabel *label;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, copy) NSString *labelName;
@end
@implementation Widget
@synthesize label, labelName;
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
// This is the code that I want to disappear
CGRect pos = CGRectMake(5, 5, 90, 30);
label = [[UILabel alloc] initWithFrame:pos];
[self addSubview:label];
self.backgroundColor = [UIColor redColor];
}
return self;
}
- (NSString *)labelName {
return label.text;
}
// This live updates the label in this custom view
- (void)setLabelName:(NSString *)name {
label.text = name;
}
- (void)dealloc {
[super dealloc];
}
@end
Код отлично работает, и я могу в реальном времени обновлять текст в пользовательских представлениях из главного контроллера представления. Однако четыре строки кода в initWithCoder представляют собой проблему. Помните дизайнеров? У меня есть они в тот момент, когда они могут творить чудеса с Interface Builder, но я могу ' На всю жизнь выяснилось, как заставить UIView загружаться из пера, который они разработали. Попытка вручную воспроизвести расположение и свойства любого отдельного предмета не так уж увлекательна и отнимает довольно много времени (и да, я понимаю, что к этому моменту все было бы сделано, если бы я не написал эту публикацию).
Итак, очень просто, как я могу взять произвольный файл .xib и заставить его выполнять ту работу, которую я делал вручную в initWithCoder? Я предполагаю, что в этот момент будет тривиально подключить IBOutlet для UILabel, но, пожалуйста, прокомментируйте это, если я слишком оптимистичен.
В качестве второстепенного вопроса, как только он будет запущен и работает в реальном пользовательском интерфейсе, У меня будут такие вещи, как UIScrollViews. Становится ли Widget UIScrollViewDelegate или где припаркован этот код. Контроллер корневого представления не должен обращать на это внимания, но кажется неуместным помещать код, который я обычно помещал в контроллер представления, в объект UIView.