为什么不能将xib文件作为子视图添加到主xib?

时间:2019-10-07 14:56:02

标签: objective-c xcode xib uicontainerview

我有一个主xib文件,并且想向其中添加/重用subview xib文件(例如android studios fragments)。我只测试了一个简单的xib文件,该文件具有粉红色的背景色,并且使用以下代码可以正常工作:

UINib *nib = [UINib nibWithNibName:@"testXib" bundle:nil];

UIView *sub = [nib instantiateWithOwner:nil options:nil][0];

[containerOutlet addSubview:sub];

[NSLayoutConstraint activateConstraints:@[
    [sub.leadingAnchor constraintEqualToAnchor:containerOutlet.leadingAnchor],
    [sub.trailingAnchor constraintEqualToAnchor:containerOutlet.trailingAnchor],
    [sub.topAnchor constraintEqualToAnchor:containerOutlet.topAnchor],
    [sub.bottomAnchor constraintEqualToAnchor:containerOutlet.bottomAnchor]
]];

这会在主xib中显示我的彩色xib。但是,一旦我尝试添加任何现有的xib文件,该应用就会因以下错误而崩溃:

  

由于未捕获的异常“ NSUnknownKeyException”而终止应用程序,原因:“ [ setValue:forUndefinedKey:]:此类不适用于键activityIndi​​catorView的键值编码兼容。”

最后一部分:“ activityIndi​​catorView”随我尝试加载的xib文件而异。有时是“ ViewingNumberBanner”或其他名称。

xib文件比工作测试xib更复杂,因此显然我必须错过一些东西。问题是我不知道从哪里开始。我可能应该提到,所有xib文件在以常规方式使用时都可以独立工作。让我知道您是否想知道其他有用的东西。

enter image description here

为了说明,我附了一张图片。

  1. 文件名。这是我在nibWithNibName:@"SecondView"

  2. 中使用的名称
  3. xib没有与之关联的class。但是,如果我没记错的话,它似乎有很多xib文件的视图(请参见屏幕左侧)。

  4. 它具有class个ColleagueTableViewController与其关联。这是我要加载的xib。我不知道当我使用index时是否是[0] instantiateWithOwner,我只是在猜测。我怎么知道?

1 个答案:

答案 0 :(得分:0)

长远来看,这里有两个问题:

  • 没有人应该将视图控制器保存在 .xib 文件中。这就是 .storyboard 文件的用途。即使您不使用segues,情节提要也允许您通过标识符实例化视图控制器,而对于 .xib 文件则无法实现。加上很多其他好东西。

  • 如果要从 .xib 文件加载视图层次结构,则该视图应该是该 .xib 中的唯一内容。然后,您无需所有者就加载它,拉出第一个视图,然后在您的界面中使用它。如果要加载多个此类视图,请在每个 .xib 中使用一个。