0

TL;DR:我有一个IBOutlet( UILabel) 已在 Storyboard 中正确连接。访问(展开)它在viewDidLoad()......内工作正常,但几秒钟后它的值为零。一个观察点说,在调用 之后,出口立即改变viewDidLayoutSubviews()但是......print()结束时的调用viewDidLayoutSubviews()显示它非零。

这与IBOutlet is nil非常相似,但他的解决方案(使用 跟踪值didSet())不起作用。(有很多相关的帖子,但都有微不足道的解决方案。)

我做了什么:

  • 将插座重新连接到标签 - 从两侧
  • 删除标签并重新连接
  • 清理项目
  • 删除了 DerivedData
  • 退出并重新启动 Xcode
  • 退出并重新启动我的 Mac
  • didSet()向插座 添加了一个方法。
    • 它在期间触发viewDidLoad()并显示非零值。
    • viewDidLoad()我设置它的文本值没有问题
    • 它在 nil-unwrapping 崩溃之前不会触发
  • 向变量添加了一个观察点。
    • 确实会在崩溃之前触发(紧随其后viewDidLayoutSubviews()并显示以下内容:

Xcode 调试器截图

如前所述,在观察点 ( viewDidLayoutSubviews()) 之前最近的方法调用退出时,出口是非零的。

这些崩溃似乎总是涉及特定超级视图的子视图。我在 superview 的出口中添加了一个观察点,但它永远不会触发。

是什么促使我的代码放弃这个弱引用?

4

1 回答 1

0

TL;DR:我正在破坏相关的观点。

好吧,找到自己答案的最好方法是问别人。感谢@DonMag,我正在准备更多的跟踪、断点和屏幕截图。我注意到了这种方法(当然是为了修复另一个错误而添加的):

屏幕截图显示我正在从超级视图中删除零的视图

当然,变成 nil 的两个视图是 的子视图centralOverlay。我想保留的。

所以我想我的答案类似于IBOutlet is nil - Pilot error - 除了didSet()处理程序没有解开谜团。

于 2018-11-07T22:56:58.727 回答