2015-02-12 2 views
9

У меня есть подкласс UITableViewCellNameInput, который подключается к xib с помощью настраиваемого метода init.Подкласс UITableViewCell с 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 
    } 

} 

Есть ли способ, что я могу инициализировать эту ячейку в методе viewDidLoad и до сих пор использовать его? Или мне нужно зарегистрировать сам класс с идентификатором повторного использования?

ответ

53

Общепринятый процесс СИБ:

  1. Зарегистрируйте свой СИБ с идентификатором повторного использования. В Swift 3:

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

    В Swift 2:

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 
    } 
    
  2. Определить пользовательский класс клеток:

    import UIKit 
    
    class NameInput: UITableViewCell { 
    
        @IBOutlet weak var firstNameLabel: UILabel! 
        @IBOutlet weak var lastNameLabel: UILabel! 
    
    } 
    
  3. Создайте файл NIB в Interface Builder (с тем же именем, который ссылается на этапе 1):

    • Укажите базовый класс ячейки tableview в NIB для ссылки на свой собственный класс ячеек (определенный на шаге 2).

    • Подключить ссылки между элементами управления в ячейке в NIB к ссылкам @IBOutlet в пользовательском классе ячеек.

  4. Ваш cellForRowAtIndexPath затем инстанцирует ячейку и установить метки. В 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 
    } 
    

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

я не был полностью уверен, из вашего примера, что контролирует вы разместили на своей камере, но выше, имеет два UILabel управления. Подключайтесь к каким-либо @IBOutlet ссылкам, которые имеют смысл для вашего приложения.

+0

Хорошо, у меня есть много разных перьев с разными подклассами. В ячейке для строки с методом индексного пути, как бы я мог заняться различными подклассами? У каждого из них разные поля и таковые. – jamespick

+1

Хорошо, допустим, у вас будет 50 строк, но есть, скажем, три основных типа конфигураций ячеек. Поэтому просто зарегистрируйте эти три NIB/XIB, каждый с собственным идентификатором повторного использования. Тогда 'cellForRowAtIndexPath' будет, основываясь на' row' и 'section'' NSIndexPath', деактивирует соответствующий идентификатор ячейки для типа ячейки, а затем заполнит поля соответствующим образом. – Rob

+0

FWIW, я на самом деле думаю, что работа с прототипами сотовых в раскадровки немного проще. Вам не нужно иметь дело с разрозненными файлами NIB, и все тут.Но используйте то, с чем вам удобнее. – Rob

3

Вы не инициализируете ячейки в viewDidLoad. Вы должны зарегистрировать XIB, а не класс, с табличным представлением. Вы должны установить ярлык и текстовое поле в tableView:cellForRowAtIndexPath: (возможно, вызвав метод экземпляра на NameInput).

+1

Спасибо, ха-ха, я какое-то время смотрел на ваш ответ, но теперь я понимаю спасибо – jamespick

Смежные вопросы