Загрузка .xibs в UIView - PullRequest
       36

Загрузка .xibs в UIView

11 голосов
/ 23 января 2010

У меня есть 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'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

Спасибо!

Ответы [ 2 ]

24 голосов
/ 23 января 2010

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

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

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

Если вы указали свой контроллер представления в качестве владельца файла для AddressView.xib в Интерфейсном Разработчике и подключили представление в XIB к выходу detailView контроллера представления, то должно быть установлено соединение между представлением и self.detailView. после вызова loadNibNamed (потому что вы указали self в качестве владельца).

Если это не сработает, попробуйте что-то вроде этого:

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;
...

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

1 голос
/ 15 октября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...