Swift 3,框架IBOutlet属性总是解包可选

时间:2017-06-27 20:06:48

标签: ios swift iboutlet ios-frameworks

我正在使用框架在我的主项目中提供自定义UI元素。框架内的UI元素类有类属性。这些类中的每一个都扩展了常见的iOS类,并拥有自己的.xib文件。

例如:

open class BaseTableViewCell : UITableViewCell {
  @IBOutlet public var title: UILabel!

  open func setContentDimmed(_ dimmed:Bool) {
    if dimmed {
       self.title.alpha = 0.3 // < crashes with nil object
    } else {
       self.title.alpha = 1.0 // < crashes with nil object
   }
}

问题在于,当我实例化BaseTableViewCell对象并调用setContentDimmed(true)func时,它会崩溃。我能改变的唯一方法就是改变

@IBOutlet public var title: UILabel! 

可选择如下:

@IBOutlet public var title: UILabel?

然后我必须解开它或它的nil(即使它在框架中未声明为un unwrapped可选)

    open class BaseTableViewCell : UITableViewCell {
      @IBOutlet public var title: UILabel?

      open func setContentDimmed(_ dimmed:Bool) {
        if let titleLabel = self.title {
          if dimmed {
           titleLabel.alpha = 0.3 // < doesn't crash, works
          } else {
           titleLabel.alpha = 1.0 // < doesn't crash, works
          }
       }

    }

在将BaseTableViewCell移动到我的框架之前,这是有效的。现在它总是一个可选的必须解开或它是零。有什么想法在这里发生吗?

我已经尝试了一切 - 我没有想法。

1 个答案:

答案 0 :(得分:0)

为什么不做这样的事情?

@IBOutlet public var title: UILabel!{
    didSet{
        guard dimmed != nil { title.alpha = 1.0; return }
        title.alpha = dimmed! ? 0.3 : 1.0
    }
}

var dimmed: Bool? {
    didSet{
        guard title != nil else { return }
        title.alpha = dimmed! ? 0.3 : 1.0
    }
}

您很可能只是在属性设置之前调用setContentDimmed