2017-07-01 4 views
0

J'ai suivi ce stackoverflow question & answer comme guide pour créer une cellule personnalisée dans la vue de table (sans ajouter de cellule prototype dans le storyboard), mais je n'ai pas réussi à créer une vue de table avec les cellules personnalisées, je viens d'obtenir des rangées de cellules vides. J'ai regardé d'autres questions de SO mais ils n'ont pas aidé.Impossible de créer une cellule de vue de table personnalisée par programme, Swift

Je crois que je fais quelque chose de mal avec la façon dont je enregistre la cellule. (FYI: Lorsque j'ajoute un prototype de cellule à ma vue de table et lui attribue un ID de classe et de cellule et que je désactive alors tableView.register(AppointmentTVCell.self, forCellReuseIdentifier: cellId) cela fonctionne, cela ne m'intéresse pas puisque je veux minimiser l'utilisation de IB)

Ci-dessous mon tableViewController en story-board, à laquelle une vue de table classe AppointmentsTVC a été attribué enter image description here

Ci-dessous mon code pour la table View Controller

class AppointmentsTVC: UITableViewController { 

    let cellId = "reuseIdentifier" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.register(AppointmentTVCell.self, forCellReuseIdentifier: cellId) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return 2 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     print("Cell for Row at func called") 
     let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! AppointmentTVCell // Creating a cell 
     cell.caseId.text = "123456" 
     return cell 
    } 

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     return 150.0 
    } 
} 

Voici mon code pour la cellule vue de tableau personnalisé

class AppointmentTVCell: UITableViewCell { 

    let caseId: UILabel = { 
     let label = UILabel() 
     label.font = UIFont.systemFont(ofSize: 14) 
     label.frame = CGRect(x: 0, y: 50, width: 100, height: 30) 
     label.numberOfLines = 2 
     //label.text = "Hello" 
     label.textColor = UIColor.black 
     return label 
    }() 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
     contentView.addSubview(caseId) 

    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 
} 
+0

Est-ce le problème parce que j'ajoute en sous-vue 'fonction awakeFromNib', je suis venu pour savoir que' awakeFromNib() 'ne sera pas appelé à moins d'un fichier nib. – user44776

+0

Il est montré dans l'image que UITableView est le point d'entrée mais que le contrôleur UItabbar devrait l'être. –

Répondre

0

Je suis venu de savoir que sans un fichier NIB, awakeFromNib ne sera pas invoqué, la vue n'a pas été ajouté. En regardant cela Stackoverflow question J'ai modifié le code ci-dessous et cela a fonctionné.

class AppointmentTVCell: UITableViewCell { 

    var caseId = UILabel() 

    required init(coder aDecoder: NSCoder) {  
     super.init(coder: aDecoder)! 
    } 


    override init(style: UITableViewCellStyle, reuseIdentifier: String!) { 

     super.init(style: style, reuseIdentifier: reuseIdentifier) 
     //Do your cell set up 
     caseId.frame = CGRect(x: 0, y: 50, width: 100, height: 30) 
     caseId.text = "Hello" 
     caseId.font = UIFont(name:"HelveticaNeue-Bold", size: 16) 
     contentView.addSubview(caseId) 
    } 


    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 
} 
1

utiliser la méthode didMoveToSuperview

class AppointmentTVCell: UITableViewCell { 

let caseId: UILabel = { 
    let label = UILabel() 
    label.font = UIFont.systemFont(ofSize: 14) 
    label.frame = CGRect(x: 0, y: 50, width: 100, height: 30) 
    label.numberOfLines = 2 
    //label.text = "Hello" 
    label.textColor = UIColor.black 
    return label 
}() 
override func didMoveToSuperview() { 
    super.didMoveToSuperview() 
    if superview != nil { 
    contentView.addSubview(caseId) 
    } 
} 

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
} 

}

+0

Je cherchais à utiliser la fonction intégrée rapide, au lieu de définir une fonction séparée et de l'appeler. – user44776

+0

@ user44776 utiliser ma réponse éditée –

+0

J'avais déjà trouvé un moyen, voir ma réponse .. – user44776