Полностью забыл синтаксис Objective C
, но вот как вы можете добиться этого в Swift
для iOS.
Отказ от ответственности: Мне хорошо известно, что между разработкой под iOS и MacOS есть много отличий, однако это демонстрация того, «как организовать свой код для решения этой конкретной задачи».Даже если он не копируется / вставляется, даже не тестируется, используемый метод остается тем же.
Допустим, у вас есть class Person
:
class Person {
var title: String = ""
var name: String = ""
var surname: String = ""
}
Вы можете добавить массив Person
в вашем ViewController.Этот массив привязан к вашему источнику данных tableView, и поэтому экземпляры Person
в нем отображаются в вашем TableView
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var personArray: [Person] = []
// MARK:- TableViewDelegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return personArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) as! CustomCell
cell.person = personArray[indexPath.row] // - 1
return cell
}
}
Как вы можете заметить, ячейка теперь содержит новую ссылку person
на связанное лицоВы хотите отобразить / отредактировать.См. Реализацию CustomCell
ниже:
class CustomCell: UITableViewCell, UITextFieldDelegate {
weak var person: Person? { // the reference to the associated person
didSet {
// when Person is set, we update the fields
titleTextField.text = person?.title ?? ""
nameTextField.text = person?.name ?? ""
surnameTextField.text = person?.surname ?? ""
}
}
@IBOutlet weak var titleTextField: UITextField!
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var surnameTextField: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
// Add action when textField text change
titleTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
nameTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
surnameTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
}
@objc func textFieldDidChange(textField: UITextField){
// switch on the textField to see which info should be edited
switch textField {
case titleTextField:
person?.title = titleTextField.text ?? ""
case nameTextField:
person?.name = nameTextField.text ?? ""
case surnameTextField:
person?.surname = surnameTextField.text ?? ""
default: break
}
}
}
При этом ваша модификация Person
обрабатывается в соответствующем CustomCell
.Когда таблица перезагружается, она сохраняет данные, которые вы уже ввели. Когда вы редактируете TextField, он изменит person
и, считая его справочным, вы увидите разницу в вашем personArray
на главном VC
Еще раз, он не копируется / вставляется и должен рассматриваться как псевдокод