Предотвратить перезапись тега UITextField - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть пользовательская ячейка, которая использует 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» напечатает этот тег при вводе в любом текстовом поле.

1 Ответ

0 голосов
/ 21 февраля 2019

Это то, что сработало для меня, и я открыт для улучшений.

Мне нужно перевести indexPath в функцию, которую я вызываю fooTyped, затем получить позицию:

// cellForRowAt
let foo = tableView.dequeueReusableCell(withIdentifier: "foo") as! foo

foo.textTyped = { sender in
  // I use a switch statement based on field
  // sender.tag would determine Street1, Street2 etc
  switch sender.tag {
  case 4:
   sender.addTarget(self, action: #selector(self.fooTyped /* omitted here */), for: .editingChanged)
   [...]
  }
}

TableView Class

// get row position
fileprivate func getRowPositionFromSender(sender: UITextField) -> Int {
    let textFieldPosition = sender.convert(sender.bounds.origin, to: self.tableView)
    let indexPath = self.tableView.indexPathForRow(at: textFieldPosition)
    return (indexPath?.row)!
}

// Then use it in fooTyped (street1)
@objc func fooTyped(sender: UITextField) {
    let position = getRowPositionFromSender(sender: sender)
    print(position) // This is what Im after
}

// Similar func for Street2
[...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...