2017-06-27 2 views
0

J'utilise un cadre pour fournir des éléments d'interface utilisateur personnalisés dans mon projet principal. Il existe des propriétés de classe pour les classes d'éléments d'interface utilisateur dans le cadre. Chacune de ces classes étend les classes iOS courantes et possède ses propres fichiers .xib.Swift 3, les propriétés du cadre IBOutlet toujours déballées en option

Par exemple:

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 
    } 
} 

Le problème est que lorsque j'instancier un objet BaseTableViewCell et appelle la setContentDimmed (true) Func, il se bloque. La seule façon que je peux le faire fonctionner est si je change

@IBOutlet public var title: UILabel! 

à une option comme:

@IBOutlet public var title: UILabel? 

alors je dois le déballer ou de son néant (même si ce ne est pas déclarée comme non déballés facultatif le cadre)

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 
      } 
     } 

    } 

Cela fonctionnait avant de déplacer BaseTableViewCell dans mon infrastructure. Maintenant c'est toujours un optionnel qui DOIT être déballé ou c'est nul. Une idée de ce qui se passe ici?

J'ai tout essayé - Je n'ai plus d'idées.

+2

Pouvez-vous montrer comment vous initialisez l'objet, ainsi que lorsque vous appelez votre méthode setContentDimmed? Ces prises sont définies à certains points du cycle de vie de la vue et si vous essayez de les utiliser auparavant, elles sont nulles. Je suppose que vous appelez la méthode trop tôt ... –

+1

Assurez-vous que 'setContentDimmed' n'est appelé qu'après (ou à partir de)' viewDidLoad'. – rmaddy

Répondre

0

Pourquoi ne pas faire quelque chose comme ça?

@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 
    } 
} 

Vous êtes le plus susceptible simplement appeler la setContentDimmed avant que la propriété est même définie.