为啥 swift uiview 不会连接到视图控制器?

Posted

技术标签:

【中文标题】为啥 swift uiview 不会连接到视图控制器?【英文标题】:Why would swift uiview not be connected to view controller?为什么 swift uiview 不会连接到视图控制器? 【发布时间】:2016-03-23 19:39:18 【问题描述】:

所以这是一个有点奇怪的问题,我什至不确定要提供什么信息。我有一个自定义视图控制器和嵌入在视图控制器中的 UIview。我在连接的视图控制器中为 UIView 创建了一个插座。一切看起来都很好,但是当我运行我的程序时,viewcontroller 和 uiview 正在连接,但 uiview 并没有成为视图控制器的属性。 (好像它是在代码中的其他地方启动的)这会产生一个异常,因为当我去设置委托时,视图被视为 nil。这是我正在查看的图片:

所以根据我设置插座的方式,视图对象应该通过 calendarview 属性链接到视图控制器。

以下是所要求的异常的样子:

任何关于如何进一步调试此问题的想法将不胜感激。

【问题讨论】:

这种情况发生在我身上好几次了。进行干净的构建并删除派生的数据目录通常会有所帮助。 调用崩溃函数的地方的代码是什么样的?具体来说,它如何获得对 ViewController 的引用? 就是第一张图片中的同一段代码。第二张图片只是相同代码的较小图片。这有意义或有帮助吗? 没有。我问的是什么调用了你发布的函数。 没有对该函数的特定调用。我相信它是通过视图控制器类从进程中调用的。我对 swifts 还是很陌生,如果这没有意义,我会原谅我。 【参考方案1】:

CalendarView 插座很可能在dayLabel 之前连接并初始化。在其初始化期间,(我在推断)它立即调用其委托,并遇到未初始化的dayLabel。请记住,初始化是随时间发生的序列;插座不会立即一起初始化。

要实现的关键是,仅在调用viewDidLoad() 时才保证插座完全连接,而不是之前。因此,在该方法和引起错误的方法中放置一个调试打印,看看哪个真正发生在第一个。我知道在哪里下注。

还将didSet print("Hey I got initialized!") 属性观察器放在您的@IBOutlets 上,以监控其精确时间。这会强制启动代码告诉您它正在做什么。

我不知道您的完整 UI 流程;您应该将整个代码库粘贴到某处。但这样做可能是正确的:

if let dayLbl = dayLabel 
    dayLbl.text = date.stringWithDateOnly()

而不是假设它已经准备好了。

【讨论】:

以上是关于为啥 swift uiview 不会连接到视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

将原型单元连接到视图控制器 [Swift 4]

在视图控制器上放置无限的uiview对象数组[关闭]

使用 Swift 在 Xcode 6 中使用 xib 在自定义 uiview 中获取 SIGABRT

将 UIView 添加到情节提要

ViewController 操作后,Swift UIView 自定义视图不会更新

如何将 UIView 插座连接到自定义子视图