Сохранить ссылку в переменной SWIFT 4

Я отправляю параметр из моего viewController в customCell. Моя пользовательская ячейка имеет текстовое поле. В моем viewController у меня есть строковая переменная для хранения значения в textField, потому что это значение я отправлю в остальные службы.

MyCustomCell

customCell: TableViewCell: {
 var data: String?
 @IBOutlet weak var textField: UITextField!

 override func awakeFromNib() {
  super.awakeFromNib()
  textField.delegate = self
 }

 func setData(data: inout String) {
  self.data = data
 }
}

extension customCell: UITextFieldDelegate {
 func textFieldDidEndEditing(_ textField: UITextField) {
  data = textField.text ?? ""
 }
}

MyViewController

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
 let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! customCell
  cell.setData(data: &data.email)
  return cell
}

Когда я отправил ссылку на customCell, я потерял ссылку в методе textFieldDidEndEditing.

2 ответа

Решение

Не делай этого.

Создайте модель данных, используя class, Класс является ссылочным типом

class Model {

    var name : String   
    var email : String

    init(name: String, email: String) {
        self.name = name
        self.email = email
    }
}

Объявите массив источника данных

var models = [Model]()

В ячейке объявить свойство модели (кстати имена классов начинаются с заглавной буквы)

class CustomCell: TableViewCell {

    @IBOutlet weak var textField: UITextField!

    var model: Model! {
       didSet {
          textField.text = model.email
       }
    }

    override func awakeFromNib() {
       super.awakeFromNib()
       textField.delegate = self
    }
}


extension CustomCell: UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        model.email = textField.text ?? ""
    }
}

В cellForRow передайте модель в ячейку

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomCell
     cell.model = models[indexPath.row]
     return cell
}

Благодаря эталонной семантике значение в модели сохраняется.

Следующее не делает то, что вы думаете:

func setData(data: inout String) {
    self.data = data
}

Конечно, String Вы перешли на этот метод inout, но это не меняет того факта, что ваша клетка String свойство является типом значения и, следовательно, ваш self.data фактически становится новым экземпляром.

По сути, вы пытаетесь достичь семантики ссылочного типа с String, который является типом значения.

Вы можете исказить себя, чтобы достичь этого, но я бы отговорить вас от попыток сделать это. Будет чище принять шаблон замыкания, протокола-делегата или реактивного типа для ячейки, чтобы уведомить контроллер представления или модель изменения.

Другие вопросы по тегам