2017-06-27 9 views
0

メインプロジェクトでカスタムUI要素を提供するためにフレームワークを使用しています。フレームワーク内のUI要素クラスのクラスプロパティがあります。これらのクラスはそれぞれ、共通のiOSクラスを拡張し、独自の.xibファイルを持っています。例えばSwift 3、フレームワークIBOutletプロパティは常にアンラップされています。

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(真)FUNCを呼び出すと、それがクラッシュすることがあります。私は、オプションのように

@IBOutlet public var title: UILabel! 

を変更した場合、私はそれを動作させることができる唯一の方法は次のとおりです。

@IBOutlet public var title: UILabel? 

が、私はそれまたはそのnilをアンラップしなければならない(そのは、国連開封され、オプションとして宣言されていないにもかかわらず、フレームワーク)

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をフレームワークに移動する前に動作していました。今では常にオプションのアンラップを行う必要があります。どんなアイデアがここで起こっている?

私はすべてを試しました。アイデアがありません。

+2

オブジェクトを初期化する方法と、setContentDimmedメソッドを呼び出すときの表示方法を教えてください。これらのアウトレットは、ビューライフサイクルの特定のポイントに設定されています。以前に使用しようとすると、それらはゼロになります。私の推測では、メソッドをあまりに早く呼び出しているということです... –

+1

'setContentDimmed'は' viewDidLoad'の後(または ')から呼び出されるだけです。 – rmaddy

答えて

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を呼んでいます。

関連する問題