一尘不染

带有XIB Swift的UITableViewCell子类

swift

我有一个使用自定义方法连接到xib 的UITableViewCell子类。NameInput``init

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方法中初始化此单元格并仍然重用它?还是我必须使用重用标识符注册类本身?


阅读 286

收藏
2020-07-07

共1个答案

一尘不染

惯用的NIB流程为:

  1. 使用重用标识符注册您的NIB。在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")
}
  1. 定义您的自定义单元格类:

    import UIKit
    

    class NameInput: UITableViewCell {

    @IBOutlet weak var firstNameLabel: UILabel!
    @IBOutlet weak var lastNameLabel: UILabel!
    

    }

  2. 在Interface Builder中创建一个NIB文件(具有在步骤1中引用的相同名称):

    • 在NIB中指定表视图单元的基类以引用您的自定义单元类(在步骤2中定义)。

    • 将NIB单元中控件之间的@IBOutlet引用与自定义单元类中的引用连接起来。

  3. 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对您的应用有意义的所有引用。

2020-07-07