首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IBOutlet是ViewControllers的零Xcode 7

IBOutlet是ViewControllers的零Xcode 7
EN

Stack Overflow用户
提问于 2015-11-26 08:25:53
回答 2查看 855关注 0票数 4

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

我已经查过他们确实有联系。我尝试用完整的nib名称实例化这个类。我还清理了项目,并销毁了导出的数据。没有一个能起作用的。

那么是什么导致了这一切呢?所有的新项目都在进行;我在我的旧项目中增加了新的渠道,它们运行得很好。所有的IBOutlets都是零,而不仅仅是被选中的少数。我正在使用Xcode 7.1.1。

我得到的错误是:

致命错误:在展开可选值时意外找到零

EN

回答 2

Stack Overflow用户

发布于 2016-01-29 17:39:40

如果其他人也面临类似的问题,我在周围找到了一份工作。IBOutlet是零,因为它的超级视图从来没有加载,所以,应用程序从来没有创建它。一个简单的黑客是在使用任何子视图之前编写这个:

代码语言:javascript
复制
let view = viewController.view

这就创建了视图,因此所有的出口都在上面。

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

票数 1
EN

Stack Overflow用户

发布于 2016-01-29 18:46:57

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

第一种方法是将子视图的更新推迟到您知道视图已经加载之后。我是通过从updateView()调用viewWillAppear()方法来做到这一点的。通常,当变量被更改时,我也会调用这个方法,所以我会在继续之前进行测试,以确保视图已经加载。如果视图还不存在,则设置视图没有任何价值。看起来是这样的:

代码语言:javascript
复制
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
        }
    }
}

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

代码语言:javascript
复制
class MyViewController: UIViewController {

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

    @IBOutlet private weak var productNameLabel: UILabel!
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33933701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档