Вложение XIB в Interface Builder / встраивание по ссылке - PullRequest
5 голосов
/ 07 октября 2010

Скажем, я создал XIB для просмотра значков.Затем я хочу встроить несколько экземпляров этого вида значка в другой контейнерный вид XIB по ссылке , поэтому, если я изменю свойства / макет в исходном виде значка XIB, экземплярыв представлении контейнера XIB отражают эти изменения.

По сути, встраивание по ссылке.

Возможно, я работаю плотно, но похоже поведение по умолчанию Interface Builder при перетаскивании представления в контейнервид это копировать все, а не ссылаться на исходный XIB?А перетаскивание экземпляра класса, связанного с представлением значков, в представление контейнера просто приводит к пустому представлению.

Я уверен, что есть способ сделать это, но я проклят, если смогу понять этоиз.Я обычно избегаю IB, как чума;)

Ответы [ 2 ]

5 голосов
/ 04 марта 2011

Нет способа сделать это напрямую в Интерфейсном Разработчике. Мне нужно было сделать что-то похожее на это в моем последнем приложении. Я закончил тем, что просто поместил представление заполнителя в то место, где вы хотите использовать xib, на который вы ссылаетесь, а затем в ваш viewDidLoad или viewWillAppear и т. Д. Вы загружаете этот xib и размещаете этот загруженный вид как дочерний элемент представления заполнителя.

NSArray *views = [[NSBundle mainBundle] loadNibNamed: @"ReferencedView" owner: self options: nil];
UIView *referencedView = (UIView *)[views objectAtIndex:0];
[self.viewPlaceholder addSubview:referencedView];

В качестве альтернативы, вы можете создать IBOutlet в вашем контроллере вида для хранения ссылочного вида и подключить эту розетку в IB. Если вы это сделаете, то вам не нужно будет вытягивать представление из NSArray.

0 голосов
/ 17 октября 2012

Вот как я это сделал:

Обратите внимание, что теперь в iOs 5 у них уже есть containerView.Насколько я знаю, это не отображается в XIB.Однако суть та же.

Создайте представление и вызовите это ContainerView.Если вы делаете это в стиле XIB, вам нужно вручную установить некоторые вещи, такие как alloc] init дочернего контроллера View, добавить его к родительскому и добавить представление к представлению parent.

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

Затем я делаю это:

- (void)viewDidLoad
{

    [super viewDidLoad];

    PO(self.childViewControllers);
    BGCRListBusinessViewController * theListController= [[BGCRListBusinessViewController alloc]init];
    self.listBusinessViewController = theListController;
    [self addChildViewController:theListController];
...
    for (UIViewController * child in self.childViewControllers) {
        child.view.frame=self.ContainerView.bounds;

    }
    //PO(self.ChangeFilter.BackgroundImage);
    //PO
    //self.ChangeFilter setBackgroundImage:[UIImage imageNamed:@] forState:<#(UIControlState)#>

    [self.ContainerView addSubview:self.listBusinessViewController.view];// initialize'
}

Тада ....

Теперь посмотрите на эту коллекцию childViewControllers.Этот новый в IOS5.Все, что он делает, это передает viewWillAppear, viewWillDisappear, ViewDidThisandThat и ViewIamRotatingWillOrDidorWh независимо.Это немного больше, но мне все равно.

Так что, если вы стремитесь к IOS4, вы можете просто вызвать все это непосредственно в родительском viewWillAppear, viewWillDisappear, ViewDidThisandThat и ViewIamRotatingWillOrDidorWh независимо от этого.

В моей реализации у меня есть указатель на тот вид viewController, который имеет представление внутри ContainerView.Такие представления получат все те функции ViewWillorDidW, которые были вызваны.

Мой родительский контроллер также имеет несколько дочерних элементов.Большинство из которых не видел.Нет проблем.Дочерние объекты, которые не видны, не получат ViewWillorDidWh независимо.

Это выполняется автоматически childViewControllers.Если вы стремитесь к IOS4, просмотрите все контроллеры представления ваших детей и посмотрите, отображается ли какой-либо из них.Если отображается, вызовите их ViewWillorDidWhwhat.

Существует также дополнительный делегат, который уведомляет, добавлен ли потомок к родителю или что-то еще.Я этим не пользовался и не знаю, для чего он используется.

Наконец, какое-то мнение может захотеть отклониться.Родители должны это сделать.Я делаю это с уведомлением.Но это уже не вопрос.IOS уже имеет такую ​​функцию для modalViewController.

...