从 XIB 文件中为 ViewController 视图加载自定义 UIView

Posted

技术标签:

【中文标题】从 XIB 文件中为 ViewController 视图加载自定义 UIView【英文标题】:Loading a custom UIView from a XIB file within a XIB for a ViewController view 【发布时间】:2012-04-28 01:39:35 【问题描述】:

我有一个WizardSequenceViewController 和一个IBOutlet WizardView *_wizardView。在许多WizardSequenceViewController.xib 文件中,我将view 插座连接到文件的所有者-WizardSequenceViewController。我有一个该视图的子视图,其类属性设置为WizardView。我已将WizardView 连接到文件所有者的插座。最后,在我的WizardView.xib 中有一个UILabel,我已将其放入文件中以测试是否正在呈现视图。当我从标签栏中选择WizardSequenceViewController 时,我看到了超级视图view,但看不到子视图_wizardView。当我在 WizardView.m 文件中的 -(id)initWithCoder 方法中设置断点时,我看到它停在那里,所以我知道它正在调用该初始化程序(因此它应该使用 xib 加载该文件)。我已经尝试了许多迭代和变化来让这个东西工作,但我做不到,我快疯了。有人有什么想法吗?

【问题讨论】:

你试过initWithNibName:@"WizardView"吗? @Wienke,如果我已经为_wizardView 设置了出口并且我知道它正在为WizardView 调用initWithCoder 初始化程序,为什么我需要调用它? 我什至不知道笔尖被认为是经过编码的。加载它们时,我总是使用 nibName。这只是一个简单的尝试的想法。或许您可以致电initWithNibName 来自 initWithCoder 其实,为什么不直接在插座上调用present方法呢? 您能澄清一下present 方法的含义吗? 【参考方案1】:

来自 Apple 文档“View Controller Basics, About Custom View Controllers”:

视图控制器与其视图层次结构中的视图之间的一一对应是关键设计考虑因素。您不应使用多个自定义视图控制器来管理同一视图层次结构的不同部分。同样,您不应使用单个自定义视图控制器对象来管理多个屏幕的内容。

注意:如果要将视图层次结构划分为多个子区域并分别管理每个子区域,请使用通用控制器对象(从 NSObject 降级的自定义对象)而不是视图控制器对象来管理每个子区域。然后使用单个视图控制器对象来管理通用控制器对象。

也许您不能在视图控制器中设置视图和子视图插座。而且我不确定将子视图出口分配给单独的 NSObject 子类是否会起作用,因为您将如何呈现它?您可以使用 initWithFrame 和 addSubview 以编程方式编写您的子视图,而不是使其成为一个出口吗?或者,如果您真的想以图形方式设置它,您可以将其分配给单独的视图控制器作为所有者吗?然后顶视图控制器将在子视图控制器上调用presentModal。或者,如果您只需要一个 UILabel 作为子视图,只需将标签添加到主视图?

【讨论】:

【参考方案2】:

即使我也遇到过类似的问题。但是通过以下链接中给出的步骤解决了它。希望能帮助到你。 http://blog.yangmeyer.de/blog/2012/07/09/an-update-on-nested-nib-loading

【讨论】:

以上是关于从 XIB 文件中为 ViewController 视图加载自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章

ViewController 的子视图的 IBOutlets 在 Storyboard 的 viewDidLoad 中为零

Swift:无法从 xib 访问子视图

如何从 XIB 文件访问 ViewController 中的 IBoutlet

如何从 UIView 类的 xib 文件导航到 ViewController

如何从 xib 文件 uiview 到情节提要 ViewController

从 xib 文件中的操作按钮推送另一个 Viewcontroller