即使已经设置了插座,它怎么可能为零

How can an outlet be nil even though it has been set

提问人:Joakim Sjöstedt 提问时间:1/26/2021 更新时间:1/27/2021 访问量:249

问:

我有两个通过.然后我从父级创建到父级。我想隐藏或显示取决于某些条件。viewControllerembeddedviewControllerscontainersoutletsviewController'scontainersclasscontainers

但是,如果我只是简单地写:

  @IBOutlet var twoArmsContainer: UIView! {
        didSet {
            print("SETTING TWO ARM")
        }
    }

 override func viewDidLoad() {
        super.viewDidLoad()
        twoArmsContainer.isHidden = true //container is nil
}

然后,在触发打印后,它会崩溃。插座怎么可能设置好,但随后变成?我试过把它藏在里面,效果很好:twoArmsContainernildidSetnildidSet

  @IBOutlet var twoArmsContainer: UIView! {
        didSet {
            print("SETTING TWO ARM")
            twoArmsContainer.isHidden = true //WORKS
        }
    }

我还能说什么?我正在从另一个工作,所以有一个.不确定这是否相关。我试着把 但结果相同。我还尝试删除并重新添加。以前从未遇到过这个问题。让我知道我是否应该显示更多代码;也许整个.不太确定什么是相关的,因为我不知道从哪里开始。classinheritsclasssuper.viewDidLoadoutletssuper classoutletsclass

ios swift uiview null iboutlet

评论

0赞 CZ54 1/26/2021
我认为容器是在viewDidLoad之后加载的。您应该尝试将代码放在 viewDidAppear 中,只是为了检查
1赞 Joakim Sjöstedt 1/26/2021
@CZ54 啊,有意思,我去看看!
0赞 Paulw11 1/26/2021
如何创建视图控制器实例?它是从情节提要创建的吗?
0赞 DonMag 1/26/2021
@JoakimSjöstedt - 仔细检查是否设置正确。我只是快速尝试了一下,无法重现该问题。IBOutlet
1赞 arturdev 1/27/2021
调用 viewDidLoad 后,所有视图始终可供使用!@CZ54所说的实际上是关于子视图控制器到该容器视图的实际嵌入过程,该过程的发生时间比调用 viewDidLoad 的时间晚一些。

答:

0赞 Joakim Sjöstedt 1/27/2021 #1

好的,所以我发现了问题所在;如果不访问代码,则无法检测到问题,因此回想起来,我应该同时发布父级和.对不起。classcontainerclass

无论如何,问题是继承自 .这使我能够在两者中共享代码。containerviewControllerparentviewControllercontainerviewControllers

所以结构基本上是这样的:

class WizardChooseArmViewController: WizardViewController {
...

这是从基础继承的。然后看起来像这样:parentviewControllerviewControllercontainerviewControllers

final class WizardTwoArmsViewController: WizardChooseArmViewController {
...

显然,从它的继承是一个坏主意,所以我重构并将其更改为:containersparent

final class WizardTwoArmsViewController: WizardViewController {
... 

不太确定为什么它不可能从它的.如果有人能向我介绍情况,那就太好了。containersinheritparent