У меня есть пользовательская ячейка, которая использует UITextField
.Я передаю данные в tableView для обработки.На самом деле, вы можете иметь несколько строк, поэтому я отслеживаю это с помощью indexPath.row
// I reuse this in all cells
struct Label {
static func textField(cell: UITableViewCell, f: Selector, tag: Int: 1) -> UITextField {
let t = UITextField()
t.tag = tag
t.addTarget(cell, action: f, for: .editingChanged)
[...] // placeholder, fonts etc
return t
}
}
В классе:
// cellForRowAt
let foo = tableView.dequeueReusableCell(withIdentifier: "foo") as! foo
foo.textTyped = { sender in
let textFieldPosition = sender.convert(sender.bounds.origin, to: self.tableView)
let indexPath = self.tableView.indexPathForRow(at: textFieldPosition)
let field = sender.tag // the int assigned inside foo's cell
print("FIELD IS: ", field) // I should see the int for the field I'm typing in
// I keep track of the row with indexPath.row
// I need to attach it to sender
sender.tag = indexPath!.row // But, this changes field
// I use a switch statement based on field
switch field {
case 4:
sender.addTarget(self, action: #selector(self.fooTyped /* omitted here */), for: .editingChanged)
[...]
}
}
В первом типе я вижу правильный int длязатем поле меняется на значение indexPath.row
Ячейка:
var textTyped: ((UITextField) -> Void)?
@objc func fieldTyped(sender: UITextField) -> Void {
textTyped?(sender)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// More than one of these but with a unique variable to setup its constraints:
let foo1 = Label.textField(cell: self, f: #selector(fieldTyped), tag: 4)
// foo2 = [...] with tag: 9 (for example)
}
Хорошим примером такой настройки является приложение Contact на вашем устройстве iOS.Нажмите «Добавить адрес», и вы увидите ячейку.Нажмите еще раз, и вы увидите другой.Я слежу за этим с indexPath.row
.В одном ряду много UITextField
с.Проблема в том, что присвоение indexPath.row
sender.tag
отбрасывает тег UITextField
s, который я установил вручную, то есть tag = 4
.Он печатает «0» ?
Я рад опубликовать больше кода, но это проблема, с которой я столкнулся только с этим битом кода.Я ожидаю, что «field» напечатает этот тег при вводе в любом текстовом поле.