Загрузка .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 теперь: - (пустой) 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

Спасибо!

11
задан Fattie 19 November 2013 в 10:29
поделиться

1 ответ

-

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

Попробуйте следующее:

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

Если вы указали свой контроллер просмотра в качестве владельца файла для AdderView.xib в интерфейсе Builder, и подключил представление в XIB к выходу «Подробнее Piew Controller», затем соединение между видом и я .DETailView должен быть на месте после вызова на loadnibmed (потому что вы указали себя как владелец).

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

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 AS @Property (сохранить) , Self.detailView = ... Присвоение позаботится о выпуске каких-либо ранее загруженных представлений. Там нет необходимости конкретно разгружать содержимое NiB.

24
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: