2010-01-22 3 views
11

У меня есть UIViewController со своим собственным .xib, и я хочу использовать UISegmentedControl для отображения различной информации в нижней половине экрана. Я создал UIView в контейнере .xib и связал его с свойством UIView с именем detailView в UIViewController контейнера.Загрузка .xibs в UIView

Затем я создал три .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 правильно?

Спасибо!

--UPDATE--

Код в viewDidLoad Сейчас: - (Недействительными) viewDidLoad { [супер 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's 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 

Спасибо!

ответ

24

Использование NSBundle's loadNibNamed:owner:options:. Он возвращает массив всех объектов верхнего уровня в файле NIB, который затем вы можете назначить своим ivars. Если вам нужно различать несколько объектов в массиве, дайте каждому уникальный тег в IB.

Попробуйте это:

case 0: 
    [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    break; 
... 

Если вы указали ваш контроллер представления в качестве файла владельца для AddressView.xib в Interface Builder, и соединили вид в XIB на выходе DetailView контроллера представления, то соединение между представлением и 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's Owner and First Responder) 
    UIView *nibView = [nibObjects objectAtIndex:0]; 
    self.detailView = nibView; 
    break; 
... 

сделать то же самое для всех случаев в заявлении выключателя. Если вы объявили detailView как @property (retain), назначение self.detailView = ... позаботится о выпуске любых ранее загруженных представлений. Нет необходимости специально разгружать содержимое NIB.

+0

Я не совсем уверен, как это сделать. Мне нужно вызвать 'loadNibNamed: owner: options:' для каждого из .xib?Можно ли увидеть какой-то грубый код, чтобы получить представление о том, как это сделать? Огромное спасибо! –

+0

Я добавил код к моему ответу. –

+0

Ole, спасибо за отличный код! Единственная проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю -loadNibNamed: owner: options, NIB накладывается поверх всего представления, он должен находиться внутри. Кажется, что 'self.detailView = nibView;' не изменяет размер загружаемого NIB, чтобы вписаться в detailView, который был настроен в IB. Есть идеи? Благодаря! –

1

В основном вам нужно использовать initWithNibName UIViewController, чтобы делать то, что вы хотите:

UIViewController *aViewController = [[UIViewController alloc] initWithNibName:@"AddressView" bundle:nil]; 
[self.detailView addSubview:aViewController.view]; 
[aViewController release]; // release the VC 

В вашем AddressView XIb, установить владельца класса в файле на UIViewController. Класс представления должен быть специальным классом AddressView.

Таким образом, вы можете позиционировать и размер подзаголовка с помощью основного файла xib. Затем используйте xib subview для компоновки элементов управления.

Смежные вопросы