Загрузка .xibs в UIView
У меня есть UIViewController со своим собственным .xib, и я хочу использовать UISegmentedControl для отображения различной информации в нижней половине экрана. Я создал UIView в контейнере .xib и связал его с свойством UIView с именем detailView
в контейнере UIViewController.
Затем я создал три .xib файла в IB, один для представления, что каждый сегмент должен отображаться в области detailView
.
Я застрял, потому что не знаю, как загрузить и выгрузить соответствующий .xib файл в область detailView
. Вот где я:
- (void)segmentValueChanged:(id)sender {
switch ([sender selectedSegmentIndex]) {
case 0:
// Unload whatever is in the detailView UIView and
// Load the AddressView.xib file into it
break;
case 1:
// Unload whatever is in the detailView UIView and
// Load the ContactsView.xib file into it
break;
case 2:
// Unload whatever is in the detailView UIView and
// Load the NotesView.xib file into it
break;
default:
break;
}
}
Итак, как я могу заполнить пробелы и правильно загрузить/загрузить detailView UIView?
Спасибо!
- ОБНОВЛЕНИЕ -
Код в viewDidLoad теперь: - (void) viewDidLoad { [super viewDidLoad];
// Set the default detailView to be address since the default selectedSegmentIndex is 0.
NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil];
// assuming the view is the only top-level object in the nib file (besides File Owner and First Responder)
UIView *nibView = [nibObjects objectAtIndex:0];
self.detailView = nibView;
self.detailContainerView.autoresizesSubviews = YES;
[self.detailContainerView addSubview:self.detailView];
NSLog(@"self.view is %@", self.view);
NSLog(@"self.detailContainerView is %@",self.detailContainerView);
NSLog(@"self.detailView is %@", self.detailView);
}
И сообщения отладчика:
self.view is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190
self.detailContainerView is UIView: 0x3a1aea0; frame = (20 57; 280 339); autoresize = W+H; layer = CALayer: 0x3a36b80
self.detailView is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190
Спасибо!
Ответы
Ответ 1
Использовать NSBundle loadNibNamed:owner:options:
. Он возвращает массив всех объектов верхнего уровня в файле NIB, который затем вы можете назначить своим ivars. Если вам нужно различать несколько объектов в массиве, дайте каждому уникальный тег в IB.
Попробуйте следующее:
case 0:
[[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil];
break;
...
Если вы указали свой контроллер представления как владельца файла для AddressView.xib в Interface Builder и подключили представление в XIB к диспетчеру detailView view view, тогда соединение между представлением и self.detailView должно быть на месте после вызова loadNibNamed (поскольку вы указали себя как владелец).
Если это не сработает, попробуйте что-то вроде этого:
case 0:
NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil];
// assuming the view is the only top-level object in the nib file (besides File Owner and First Responder)
UIView *nibView = [nibObjects objectAtIndex:0];
self.detailView = nibView;
break;
...
Сделайте то же самое для всех случаев в инструкции switch. Если вы объявили detailView как @property (retain)
, назначение self.detailView = ...
позаботится о выпуске ранее загруженных представлений. Нет необходимости специально выгружать содержимое NIB.
Ответ 2
В основном вам нужно использовать UIViewController initWithNibName, чтобы делать то, что вы хотите:
UIViewController *aViewController = [[UIViewController alloc] initWithNibName:@"AddressView" bundle:nil];
[self.detailView addSubview:aViewController.view];
[aViewController release]; // release the VC
В элементе AddressView xib задайте класс File Owner для UIViewController. Класс представления должен быть обычным классом AddressView.
Таким образом вы можете позиционировать и размер subview с помощью основного файла xib. Затем используйте subview xib для компоновки элементов управления.