2015-02-12 13 views
9

Ich habe eine UITableViewCell Unterklasse NameInput, die eine Verbindung zu einer Xib mit einer benutzerdefinierten init Methode herstellt.UITableViewCell Unterklasse mit 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 
    } 

} 

Gibt es eine Weise, die ich diese Zelle in der viewDidLoad Methode initialisieren kann und es immer noch wiederverwenden? Oder muss ich die Klasse selbst mit einer Wiederverwendungskennung registrieren?

Antwort

53

Der üblicher NIB Prozess ist:

  1. Registrieren NIB mit der Wiederverwendung Kennung. In Swift 3:

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

    In Swift 2:

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 
    } 
    
  2. Definieren Sie Ihre individuelle Zellklasse:

    import UIKit 
    
    class NameInput: UITableViewCell { 
    
        @IBOutlet weak var firstNameLabel: UILabel! 
        @IBOutlet weak var lastNameLabel: UILabel! 
    
    } 
    
  3. eine NIB-Datei im Interface Builder erstellen (mit dem gleichen Namen referenziert in Schritt 1):

    • Geben Sie die Basisklasse der Tableview-Zelle in der NIB an, um auf Ihre benutzerdefinierte Zellklasse (in Schritt 2 definiert) zu verweisen.

    • Verknüpfen Sie Verweise zwischen den Steuerelementen in der Zelle in der NIB an die @IBOutlet Verweise in der benutzerdefinierten Zellklasse.

  4. Ihre cellForRowAtIndexPath würde dann die Zelle instanziiert und die Etiketten. 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 
    } 
    

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

war ich von Ihrem Beispiel nicht ganz sicher, was Sie auf Ihrer Zelle platziert steuert, aber die oben hat zwei UILabel Kontrollen. Schließen Sie alle möglichen @IBOutlet Referenzen an, die für Ihre App sinnvoll sind.

+0

Okay, im Grunde habe ich viele verschiedene Nibs mit verschiedenen Unterklassen. Wie würde ich in der Zelle für die Zeile mit der Indexpfadmethode die verschiedenen Unterklassen behandeln? Sie haben jeweils unterschiedliche Felder und dergleichen. – jamespick

+1

Ok, nehmen wir an, Sie haben 50 Zeilen, aber es gibt, sagen wir mal, drei verschiedene Arten von Zellkonfigurationen. Registrieren Sie einfach diese drei NIB/XIBs, jede mit ihrer eigenen Wiederverwendungskennung. Dann würde 'cellForRowAtIndexPath' basierend auf' row' und 'section' von' NSIndexPath' die entsprechende Zellenkennung für den Typ der Zelle aus der Warteschlange entfernen und dann die Felder entsprechend auffüllen. – Rob

+0

FWIW, ich denke eigentlich, dass das Arbeiten mit Zellprototypen in Storyboards etwas einfacher ist. Sie müssen nicht mit verschiedenen NIB-Dateien umgehen und alles ist genau da.Aber benutze, was immer du lieber hast. – Rob

3

Sie initialisieren keine Zellen in viewDidLoad. Sie sollten das XIB, nicht die Klasse, mit Ihrer Tabellenansicht registrieren. Sie sollten das Label und das Textfeld in tableView:cellForRowAtIndexPath: einrichten (möglicherweise durch Aufrufen einer Instanzmethode unter NameInput).

+1

Danke haha ​​Ich habe deine Antwort schon eine Weile angeguckt, aber jetzt verstehe ich Danke – jamespick

Verwandte Themen