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

Posted

技术标签:

【中文标题】在 Interface Builder 中嵌套 XIB/通过引用嵌入【英文标题】:Nesting XIBs in Interface Builder / embedding by reference 【发布时间】:2010-10-07 06:26:05 【问题描述】:

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

本质上,通过引用嵌入。

也许我很密集,但在将视图拖入容器视图时,Interface Builder 的默认行为似乎是复制所有内容,而不是引用原始 XIB?并且将与图标视图关联的类的实例拖到容器视图中只会导致空白视图。

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

【问题讨论】:

【参考方案1】:

没有办法直接在 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 中连接该插座。如果你这样做了,那么你就不需要把视图拉出 NSArray。

【讨论】:

【参考方案2】:

我就是这样做的:

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

创建一个视图,然后调用该 ContainerView。如果您使用 XIB 样式,则需要手动设置一些东西,例如 alloc]init 子视图控制器,将其添加到父视图并将视图添加到父视图。

如果您在情节提要中执行此操作,则可以从该 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这样的功能了。

【讨论】:

以上是关于在 Interface Builder 中嵌套 XIB/通过引用嵌入的主要内容,如果未能解决你的问题,请参考以下文章

在 Interface Builder 中创建的 Table View Controller 的底部单元格在 iPhone X 上被剪裁和隐藏

通过 Interface Builder 更改 UIView 属性

XCode 6.3 错误:Interface Builder 文件中的未知类

在 Interface Builder 中连接元素

在 Interface Builder 中使用 UITapGestureRecognizers 的问题

在 Interface Builder 中访问 NSMutableDictionary 值