Пользовательский интерфейс UIView, настроенный с помощью InterfaceBuilder

Многие люди задавали аналогичный вопрос, но ответы были либо достаточно расплывчатыми, либо не в том направлении, в котором мне нужно было развиваться, поэтому я постараюсь задать этот вопрос как можно более конкретно. Контекст этого вопроса касается разработки 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.

5
задан Waldo 11 April 2011 в 04:55
поделиться