メインプロジェクトでカスタム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をフレームワークに移動する前に動作していました。今では常にオプションのアンラップを行う必要があります。どんなアイデアがここで起こっている?
私はすべてを試しました。アイデアがありません。
オブジェクトを初期化する方法と、setContentDimmedメソッドを呼び出すときの表示方法を教えてください。これらのアウトレットは、ビューライフサイクルの特定のポイントに設定されています。以前に使用しようとすると、それらはゼロになります。私の推測では、メソッドをあまりに早く呼び出しているということです... –
'setContentDimmed'は' viewDidLoad'の後(または ')から呼び出されるだけです。 – rmaddy