2015-02-12 16 views
9

Ho una sottoclasse NameInputUITableViewCell che si collega a uno xib con un metodo personalizzato init.Sottoclasse UITableViewCell con XIB Swift

class NameInput: UITableViewCell { 

    class func make(label: String, placeholder: String) -> NameInput { 

     let input = NSBundle.mainBundle().loadNibNamed("NameInput", owner: nil, options: nil)[0] as NameInput 

     input.label.text = label 
     input.valueField.placeholder = placeholder 
     input.valueField.autocapitalizationType = .Words 

     return input 
    } 

} 

C'è un modo per inizializzare questa cella nel metodo viewDidLoad ed ancora riutilizzarlo? O devo registrare la classe stessa con un identificativo di riutilizzo?

risposta

53

Il processo NIB abituale è:

  1. Registra il tuo NIB con l'identificatore riutilizzo. In Swift 3:

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.register(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 
    } 
    

    a Swift 2:

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 
    } 
    
  2. Definire la classe di cella personalizzato:

    import UIKit 
    
    class NameInput: UITableViewCell { 
    
        @IBOutlet weak var firstNameLabel: UILabel! 
        @IBOutlet weak var lastNameLabel: UILabel! 
    
    } 
    
  3. Creare un file NIB in Interface Builder (con lo stesso nome di riferimento nel passaggio 1):

    • Specificare la classe base della cella tableview in NIB per fare riferimento alla classe di celle personalizzata (definita nel passaggio 2).

    • Collegare i riferimenti tra i controlli nella cella nella NIB ai riferimenti @IBOutlet nella classe di celle personalizzate.

  4. tuo cellForRowAtIndexPath sarebbe poi istanziare la cella e impostare le etichette. In Swift 3:

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! NameInput 
    
        let person = people[indexPath.row] 
        cell.firstNameLabel.text = person.firstName 
        cell.lastNameLabel.text = person.lastName 
    
        return cell 
    } 
    

    a Swift 2:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! NameInput 
    
        let person = people[indexPath.row] 
        cell.firstNameLabel.text = person.firstName 
        cell.lastNameLabel.text = person.lastName 
    
        return cell 
    } 
    

non ero del tutto sicuro dal vostro esempio quello dei controlli è stato posizionato sul tuo cellulare, ma l'ha soprattutto due UILabel controlli. Collegati a qualsiasi cosa @IBOutlet riferimenti abbiano senso per la tua app.

+0

Okay in sostanza ho un sacco di pennini diversi con sottoclassi di celle diverse. Nella cella per riga con il metodo dell'indice, come dovrei fare per trattare le diverse sottoclassi? Ognuno di essi ha campi diversi e così via. – jamespick

+1

Ok, supponiamo che avrai 50 righe, ma che esistono, diciamo, tre tipi base di configurazioni di celle. Quindi registra solo quei tre NIB/XIB, ognuno con il proprio identificativo di riutilizzo. Quindi 'cellForRowAtIndexPath', in base a' row' e 'section' di' NSIndexPath', deseleziona l'identificatore di cella appropriato per il tipo di cella, quindi popola i campi come appropriato. – Rob

+0

FWIW, in realtà penso che lavorare con i prototipi di celle negli storyboard sia un po 'più semplice. Non hai a che fare con file NIB disparati e tutto è proprio lì.Ma usa quello con cui ti senti più a tuo agio. – Rob

3

Non si inizializzano le celle in viewDidLoad. Dovresti registrare XIB, non la classe, con la tua vista tabella. È necessario impostare l'etichetta e il campo di testo in tableView:cellForRowAtIndexPath: (eventualmente chiamando un metodo di istanza su NameInput).

+1

Grazie haha ​​Sono stato a fissare la tua risposta per un po ', ma ora capisco grazie – jamespick

Problemi correlati