界面构建器中嵌套XIB / 通过引用嵌入

5
假设我已经创建了一个用于图标视图的XIB。现在我想通过引用将该图标视图的多个实例嵌入到不同的XIB容器视图中,这样如果我在原始图标视图XIB中更改属性/布局,则容器视图XIB中的实例会反映这些更改。
基本上,是通过引用进行嵌入。
也许我很愚蠢,但当拖动视图到容器视图中时,Interface Builder的默认行为似乎是复制所有内容,而不是引用原始XIB?并且将与图标视图相关联的类的实例拖到容器视图中只会导致一个空视图。
我确定有一种方法可以做到这一点,但我死也想不出来。我通常像瘟疫一样避免使用IB ;)
2个回答

6

在Interface Builder中没有直接实现这个功能的方法。我在上一个应用程序中需要做类似的事情。最终我所做的是,在您想要引用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中连接该outlet。如果这样做,您就不需要从NSArray中取出视图。


0

这是我的做法:

注意,现在在iOs 5中它们已经有了containerView。据我所知,它不会出现在XIB中。然而,本质是相同的。

创建一个视图,并将其命名为ContainerView。如果您按照XIB样式进行操作,则需要手动设置一些内容,例如分配并初始化子视图控制器,将其添加到父级并将视图添加到父级的视图中。

如果您在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中调用所有这些方法。

在我的实现中,我有一个指向ContainerView中包含视图的任何viewController的指针。这样的视图将调用所有这些ViewWillorDidWhatever函数。

我的父控制器也有几个子控制器。其中大部分都看不见。没有问题。未显示的子控制器将不会得到ViewWillorDidWhatever。

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

还有一些额外的委托通知子项是否添加到父项或其他内容。我没有使用它,也不知道它的用途。

最后,有些视图可能需要被关闭。这应该由父视图完成。我通过通知来实现这一点。但这已经超出了问题的范围。IOS已经为modalViewController提供了这样的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接