ios - 防止 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
。一排有很多UITextField
s。问题是, to 的分配indexPath.row
会sender.tag
抛出UITextField
我手动设置的 s 标签,即tag = 4
. 它打印“0”
我很高兴发布更多代码,但这就是我对那一点代码的问题。我希望“字段”在我输入任何文本字段时打印该标签。
解决方案
这对我有用,我愿意改进。
我需要转到indexPath
Im 调用的函数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
[...]
推荐阅读
- python-3.x - 按下按钮时在mac上将文本转换为语音
- python - 如何自动下载网站生成的电子表格?
- java - 我收到了一份关于 crushes java.lang.RuntimeException 的报告:
- javascript - 如何在移动版专注于输入的同时保持聊天的滚动水平?
- database - 在 MongoDB 中使用 $AND(查询)
- concourse - Concourse CI git克隆多个repos到同一个目录
- python - IndexError:检查 json 正文时列表索引超出范围
- r - 如何在 R 中自动进行变量替换?
- python - 我试图制作一个 nike snkrs 机器人,但是当机器人登录时它会出错
- javascript - 如何从 Vue 3 中的 List 中的 List 获取所有值