Search code examples
iosswiftuitableviewcell

Retain cells in UITableView in Swift?


UITableView by default reuse cells. But in my case some cells have a UITextField object and I don't want to loose its value when the cell is reused. The table has few rows so I can handle all the cells in memory.

Example of code I currently use:

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UINib(nibName: "TPAddressInfoTableViewCell", bundle: nil), forCellReuseIdentifier: InfoCellIdentifier)
        ...

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let item = items[indexPath.row]
        switch item.appearance {
        case .textWithTitle:
            let cell = tableView.dequeueReusableCell(withIdentifier: InfoCellIdentifier) as! TPAddressInfoTableViewCell
            return cell
        case .picker:
            ...

How to retain such cells correctly? Linking UITextFieldDelegate of each cell to current UIViewController seems to be extra in this case.


Solution

  • Don't retain cells.

    Save all values of the UI elements of the cell in the data model and restore the values in cellForRow.

    For example pass the corresponding model item to the cell in cellForRow and save the text field string in a property when it changes.
    Alternatively use a callback closure to update the property in the controller.