首页 > 解决方案 > 防止 UITextField 标记被覆盖

问题描述

我有一个使用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)
}

这个设置的一个很好的例子是你 iOS 设备上的联系人应用程序。点击“添加地址”,您会看到一个单元格。再次点击,你会看到另一个。我用 跟踪它indexPath.row。一排有很多UITextFields。问题是, to 的分配indexPath.rowsender.tag抛出UITextField我手动设置的 s 标签,即tag = 4. 它打印“0”

我很高兴发布更多代码,但这就是我对那一点代码的问题。我希望“字段”在我输入任何文本字段时打印该标签。

标签: iosswiftuitableviewuitextfield

解决方案


这对我有用,我愿意改进。

我需要转到indexPathIm 调用的函数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)
   [...]
  }
}

表视图类

// 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
[...]

推荐阅读