【问题标题】:IBOutlet is nil Xcode 7 for ViewControllersViewControllers 的 IBOutlet 为零 Xcode 7
【发布时间】:2016-01-30 02:46:57
【问题描述】:

当我创建一个新的 NSVC 子类并向其中添加一些 IBoulet 时,当我尝试访问它们时它们总是为零。我试过创建一个新项目,只有一个 VC 类和一个 Outlet,但它仍然为零。

我已检查它们确实已连接。我试过用完整的笔尖名称实例化类。我还清理了项目,并丢弃了派生数据。没有任何区别。

那么可能是什么原因造成的呢?所有新项目都在发生;我在旧项目中添加了新的网点,它们运行良好。所有的 IBOutlets 都是 nil,而不仅仅是选择的几个。我在 Xcode 7.1.1 上。

我得到的错误是:

致命错误:在展开可选值时意外发现 nil

【问题讨论】:

  • 当您测试网点时,您是在调用viewDidLoad 期间还是之后进行测试?
  • @ThomasW 我在期间和之后都尝试过,两者都是零。我刚刚重新创建了整个类,现在我可以更改viewDidLoad 中的值,但如果我在此之后的任何时间尝试访问它,它就是 nil。
  • 你是如何加载视图控制器的?
  • @ThomasW 设置为Popover的contentViewController,所以我自己不做。
  • 是否有更多关于致命错误的信息,比如回溯?

标签: xcode swift macos


【解决方案1】:

如果其他人面临类似问题,我找到了解决方法。 IBOutlet 为零,因为它的超级视图从未加载,因此应用程序从未创建它。一个简单的技巧是在使用任何子视图之前编写这个:

let view = viewController.view

这将创建视图,因此创建了所有的出口。

P.S. 我知道这不是一个真正的解决方案,但我想不出另一种解决方案。如果有人有任何建议,请随时发布。

【讨论】:

  • 对我来说这种方法很好,用于测试。
【解决方案2】:

我的猜测是,在视图加载之前,您正试图在 init 方法中访问出口,或者在设置值时从访问器访问。有两种方法可以处理这种情况。

首先是推迟更新子视图,直到您知道视图已加载。我通过从viewWillAppear() 调用updateView() 方法来做到这一点。当变量发生变化时,我通常也会调用此方法,因此我在继续之前进行测试以确保视图已加载。如果视图尚不存在,则设置视图没有任何价值。它看起来像这样:

class MyViewController: UIViewController {

    var product: Product {
        didSet {
            updateView()
        }
    }

    @IBOutlet private weak var productNameLabel: UILabel!

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        updateView()
    }

    private func updateView() {
        guard isViewLoaded() else {
            return
        }

        if let product = product {
            productNameLabel.text = product.title
        }
    }
}

另一个选项与您正在做的类似,是强制视图提前加载。我认为这不太理想,但在某些情况下,这是正确的方法。但是不要像你发现的那样做,而是像这样有意识地做:

class MyViewController: UIViewController {

    var product: Product {
        didSet {
            loadViewIfNeeded()
            productNameLabel.text = product.title
        }
    }

    @IBOutlet private weak var productNameLabel: UILabel!
}

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2015-07-26
    相关资源
    最近更新 更多