【问题标题】:NSLayoutConstraint outlets are allways nil while other outlets aren'tNSLayoutConstraint 出口总是 nil 而其他出口不是
【发布时间】:2016-11-23 07:58:58
【问题描述】:

我正在通过 xib 实例化一家商店:

let cShop = UINib(nibName: "connectedShop", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! connectedShop

这家商店已经分配了这个自定义类:

    import Foundation
import UIKit
class connectedShop : UIView{

    @IBOutlet weak var bannerViewHight: NSLayoutConstraint!

    @IBOutlet weak var bannerViewTop: NSLayoutConstraint!
    @IBOutlet weak var bannerViewLeft: NSLayoutConstraint!
    @IBOutlet weak var bannerViewRight: NSLayoutConstraint!

    @IBOutlet weak var banerDiscount: UIImageView!
    @IBOutlet weak var bannerImageShop: UIImageView!
    @IBOutlet weak var bannerTitle: UILabel!
    @IBOutlet weak var bannerDescription: UILabel!
    @IBOutlet weak var bannerButton: UIButton!

    @IBAction func bannerButtonAction(sender: UIButton) {

    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }
}

从代码中我这样称呼这家商店:

let cShop = UINib(nibName: "connectedShop", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! connectedShop


cShop.bannerTitle.text = "shopTitle"  //work


shopContainer.addSubview(cShop)

cShop.bannerViewLeft.constant = 0  //make my app crash
cShop.bannerViewRight.constant = 0 // "
cShop.bannerViewTop.constant = 0  //  "

当我设置bannerTitle.text 属性时,我的应用程序继续并调试我看到这个插座已初始化,但约束不是,当编译器在分配常量的行中时,它总是抛出相同的错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

调试我看到有一个插座被初始化:

有人知道为什么会这样吗?

这些是我的连接:

【问题讨论】:

  • 您能否展示一下您是如何在 Interface Builder 中连接它们的?
  • 编辑添加我的连接图片
  • 你能打电话给print(cShop.bannerTitle.text) 吗?如果接收者为 nil,设置该值不会导致崩溃,这就是为什么它不会在此行崩溃,但 bannerTitle 也可能为 nil。
  • 我查过了,不是零。此外,还有一个不是 nil 的 outlet,只有一个,bannerViewHight,是自定义类的第一个。这怎么可能?我不明白...
  • 您能在 Intreface Builder 中选择您的 connectedShop,然后在右侧的 Connections Inspector 中选择吗?您将能够看到所有已连接的插座。

标签: ios swift swift2 storyboard interface-builder


【解决方案1】:

我有同样的问题。 将约束出口更改为强。

【讨论】:

  • 这解决了我的问题,但是我不明白为什么它会起作用。你能解释一下它的原因吗? @SergioM
  • @YusufKamilAK 当然。由于引用很弱,因此对约束的引用将在生命周期的某个时间点被删除。
  • @SergioM 这并不能真正解释问题出在哪里。
  • 当然,所以在我的例子中,视图是一个单元格。当重新使用单元格时,由于引用很弱,因此解除分配的约束。
【解决方案2】:

如何使约束出口变得强大: 只需从声明中删除 weak。

@IBOutlet weak var bannerViewHight: NSLayoutConstraint!

@IBOutlet var bannerViewHight: NSLayoutConstraint!

为所有人做,仅此而已。

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多