通过引用将XIB嵌套在Interface Builder /嵌入中

时间:2010-10-07 06:26:06

标签: xcode interface-builder xib

假设我已经为图标视图创建了一个XIB。然后,我想在不同的 XIB容器视图中引用嵌入此图标视图的多个实例,因此如果我在原始图标视图XIB中更改属性/布局,容器视图XIB中的实例反映了这些更改。

基本上,通过引用嵌入。

也许我是密集的,但是当将视图拖入容器视图时,接口生成器的默认行为似乎是将所有内容复制过来,而不是引用原始的XIB?将与图标视图关联的类的实例拖到容器视图中只会产生空白视图。

我确信有办法做到这一点,但如果我能搞清楚,我该死的。我通常会像瘟疫一样避免IB;)

2 个答案:

答案 0 :(得分:5)

在Interface Builder中无法直接执行此操作。我需要在上一个应用程序中做类似的事情。我最终做的只是在您想要引用的xib的位置放置一个占位符View,然后在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中取出视图了。

答案 1 :(得分:0)

我就这样做了:

请注意,现在在iOs 5中他们已经拥有了containerView。据我所知,它并没有出现在XIB中。然而,本质是一样的。

创建一个视图,并调用该ContainerView。如果你这样做XIB样式你需要手动设置一些东西,比如alloc] init子视图控制器,将它添加到父视图并将视图添加到父视图。

如果您在storyboard中执行此操作,则可以从该ContainerView链接到其他控制器并创建嵌入segue。但是,它仅适用于一个视图控制器,其余部分需要相同。

然后我这样做:

- (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和ViewIamRotatingWillOrDidorWhatever。它确实比这更多但我不在乎。

因此,如果你的目标是IOS4,你可以直接在父viewWillAppear,viewWillDisappear,ViewDidThisandThat和ViewIamRotatingWillOrDidorWhatever中直接调用所有这些。

在我的实现中,我有一个指向viewController在ContainerView中具有视图的指针。这样的视图将获得所有ViewWillorDidWhatever函数。

我的父控制器也有几个孩子。大多数都没有看到。没问题。未见过的孩子将无法获得ViewWillorDidWhatever。

这是由childViewControllers自动完成的。如果您的目标是IOS4,请查看所有子视图控制器的视图,并查看是否显示了其中任何一个。如果显示,请调用他们的ViewWillorDidWhatever。

还有一些额外的委托来通知孩子是否被添加到父母或其他什么。我没有使用它,也不知道它用于什么。

最后,某些观点可能会被驳回。父母应该这样做。我通过通知完成了。但这已经超出了问题的范围。 IOS已经为modalViewController提供了这样的功能。