2017-03-27 1 views
1

Je rencontre des problèmes pour visualiser ma cellule de vue de table personnalisée dans le constructeur d'interface.Swift 3: cellule de vue de table personnalisable

Est-ce que quelqu'un sait comment faire une cellule de table @Designable?

Lorsque j'importe ma cellule de vue de table personnalisée dans un storyboard avec une vue de table, seule la couleur de fond fonctionne. Lorsque j'essaie de définir le texte de l'étiquette dans ma cellule de vue de table, le constructeur de l'interface se bloque.

Ma configuration est appelée à partir des méthodes suivantes:

- override public init(style: UITableViewCellStyle, reuseIdentifier: String?) 

- required public init?(coder aDecoder: NSCoder) 

Je pense qu'il est parce que mon étiquette n'est pas initialisés en ce moment?

code:

import UIKit 

@IBDesignable class ProgressHeaderTableViewCell: UITableViewCell { 

    @IBOutlet weak var headerLabel: UILabel! 

    // MARK: - View methods 

    override public init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
     self.setupNib() 
    } 

    // MARK: - NSCoding 
    required public init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.setupNib() 
    } 

    func setupNib(){ 
     self.backgroundColor = UIColor.blue 

//  self.headerLabel.text = "Hello world" 
    } 

} 

Code Mise à jour:

import UIKit 

@IBDesignable class CustomTableView: UITableViewCell { 

@IBOutlet weak var headerLabel: UILabel! 

// MARK: - View methods 
override func prepareForInterfaceBuilder() { 
    self.awakeFromNib() 
} 

override public init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    //check that there are no current subviews 
    if self.subviews.count == 0 { 
     self.setupNib() 
    } 
} 


// MARK: - NSCoding 
required public init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    //check that there are no current subviews 
    if self.subviews.count == 0 { 
     self.setupNib() 
    } 
} 


override func awakeFromNib() { 
    super.awakeFromNib() 

    self.backgroundColor = UIColor.blue 
    if headerLabel != nil { 
     self.headerLabel.text = "Hello world" 
    } 
} 

func setupNib(){ 
    let bundle = Bundle(for: CustomTableView.self) 
    guard let customView = bundle.loadNibNamed("CustomTableView",owner: self, options: nil)?.first as? CustomTableView else { 
     return 
    } 
    customView.frame = self.bounds 
    self.addSubview(customView) 
} 
} 

Merci!

+0

Veuillez ajouter les méthodes de source de données tbaleView. – CodeChanger

+0

Les méthodes de source de données sont ajoutées. J'essaye de placer l'étiquette à l'intérieur de mon UITableViewCell, ce qui veut dire que j'ai un IBOutlet sur mon label? Ne devrait-il pas être initialisé alors? – PAK

+0

Pouvez-vous poster du code pour plus de précisions? – CodeChanger

Répondre

1

Je pense qu'il y a quelques problèmes possibles que vous pouvez examiner ici. Tout d'abord, chaque fois que vous créez une vue personnalisée, vous devrez l'associer au nom du fichier xib.

func setupNib(){ 
    let bundle = Bundle(for: ProgressHeaderTableViewCell.self) 
    guard let customView = bundle.loadNibNamed("NAME_OF_XIB_FILE_GOES_HERE",owner: self, options: nil)?.first as? ProgressHeaderTableViewCell else { 
     return 
    } 
    customView.frame = self.bounds 
    self.addSubview(customView) 
} 

De plus, chaque fois que je travaille avec des fichiers XIB, je fais une configuration vue dans la méthode awakeFromNib() après vérification pour vous assurer que l'un des éléments attendus est non nul.

override func awakeFromNib() { 
    if headerLabel != nil { 
     self.backgroundColor = UIColor.blue 
     self.headerLabel.text = "Hello world" 
    } 
} 

Enfin, je ne l'ai été en mesure d'obtenir IBDesignables travailler quand j'Envelopper les fonctions de configuration avec le chèque qu'il n'y a pas subviews courant:

override public init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    //check that there are no current subviews 
    if self.subviews.count == 0 { 
     self.setupNib() 
    { 
} 

// MARK: - NSCoding 
required public init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    //check that there are no current subviews 
    if self.subviews.count == 0 { 
     self.setupNib() 
    { 
} 

PS Quand j'étais En apprenant cela, j'ai trouvé ce blog super utile. Vous voudrez peut-être le parcourir vous-même pour vous familiariser avec les vues IBDesignable et personnalisées. http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6

+0

Merci pour votre réponse! Je n'arrive toujours pas à utiliser l'utilisation de ma cellule personnalisée dans l'IB, mais maintenant elle ne plante plus. Le code courant est mis à jour dans le message original ^^. Il ne met à jour ma vue personnalisée dans le storyboard, quand j'ai utilisé prepareForInterfaceBuilder(), comme indiqué ci-dessus, où je peux définir la couleur de fond en bleu. Mais à ce moment l'étiquette est nulle. – PAK

+0

N'appelez pas réveillé de la plume, cette méthode sera appelée pour vous. – faircloud

+0

Si je supprime: override func prepareForInterfaceBuilder() { auto.awakeFromNib() } Rien n'est rendu dans l'IB – PAK