2010-12-11 4 views
14

У меня есть ViewController.xib, сделанный в IB, который имеет UITableView. Я хочу построить еще один xib-файл, например. SearchViewController.xib, наследует от ViewController.xib. Новый SearchViewController.xib должен наследовать UITableView и дополнительно должен иметь UISearchBar и UIButton.наследовать xib-файл в Interface Builder

Это можно сделать с помощью Interface Builder?

ответ

10

Нет, у NIB-файлов нет концепции наследования. Единственный вариант - дублировать исходный файл и вносить необходимые изменения в копию.

+2

Как сказал Оле, наследования нет. Вы можете и должны наследовать контроллеры, которые обрабатывают представления, которые разделяют функциональность. – fsaint

+0

Кроме того, возможно создание xib для определенного вида (хотя это не так просто, как должно быть). – Sulthan

1

Вам понадобятся отдельные .xib-файлы или использовать один по умолчанию, а затем добавить элементы управления (например, SearchViewController и т. Д.) Программно в код.

0

Это действительно проблема, о которой следует заботиться в следующих версиях xCode. Поскольку вам нужно написать код, ваш интерфейс должен быть унаследован в других классах, что является кошмаром в случае необходимости изменений позже. Или вы можете копировать/paste xib, который также станет кошмаром, поскольку вам нужно будет открыть их все и применить модификации.

1

Способ думать, что XIB-файл представляет собой сериализованный объект , а не класс. Экземпляр класса (т. Е. Объект) не может быть подклассом, за исключением некоторых языков, основанных на прототипах, таких как Javascript.

Один из способов издеваться над этим - это создать родительский класс типа UIView, который будет загружать XIB и добавлять его к себе (помните, что XIB содержит NSArray визуальных элементов).

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"TestView" owner:self options:nil]; 
     UIView* mainView = (UIView*)[nibViews objectAtIndex:0]; 
     self.label.text = @"Parent"; 
     [self addSubview:mainView]; 
    } 
    return self; 
} 

Ребенок может тогда просто переопределить Инициализатор, как

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.label.text = @"Child"; 
    } 
    return self; 
} 

self.label, конечно, связанно с UILabel в файле XIB через интерфейс строитель и подключен во время выполнения с помощью owner:self аргумента.

+1

Лучший ответ здесь, честно говоря. – BonanzaDriver

4

Вы можете использовать представление контейнера для повторного использования определенного контроллера вида. Таким образом, вы должны создать только один раз, добавить логику один раз, и вы можете просто повторно использовать компонент где-либо вам нравится:

enter image description here

Это Apples documentation на контейнерном View, надеюсь, что это помогает!

0

Проблема заключается в том, что подкласс вызывает initWithNibName с его именем класса.

Я бы с принуждая суперкласс для загрузки суперкласса XIB всегда, даже если в наследство (убедитесь, что выходы в .h из суперкласса)

в суперкласса переопределение initWithNib (она будет называться так же, как обычно init, если вы создали xib based vc)

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:@"NameOfTheSuperClass" bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 
Смежные вопросы