我正在UITableView
创建一个表单。此表单在原型单元格中有UILabel
和UITextField
。每个UITextField
都有一个唯一标记。
当用户点击提交按钮时,我希望使用标记从每个UITextField
获取价值
现在问题是我有18 UITextField
当我在字段中输入值并滚动视图以填充剩余的字段时,在我按下提交按钮填充数据后,应用程序崩溃。它无法找到第一个UITextField
的标记。
我想比较UITextFields值。但我不想收集所有文本字段的值。我想检索特定的文本字段值,并将其与提交按钮单击上的其他文本字段值进行比较。
This is how my UITableView Looks
这是我的代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SurveyFormTableViewCell", for: indexPath) as! SurveyFormTableViewCell
var pest_code = textfield_id_value[indexPath.row].pest_code
var srno = textfield_id_value[indexPath.row].srno
var inspection_no = textfield_id_value[indexPath.row].inspection_no
cell.text_field.layer.cornerRadius = 3
cell.text_field.layer.borderWidth = 1
cell.text_field.addTarget(self, action: #selector(tableFieldDidChange(_textField:)), for: .editingChanged)
let id:Int = Int("\(srno)\(pest_code)\(inspection_no)")!
cell.text_field.tag = id
cell.label?.text = struc_array[indexPath.item].pest
cell.label?.numberOfLines = 0
cell.label?.lineBreakMode = NSLineBreakMode.byWordWrapping
cell.layer.borderWidth = 1
return cell
}
@IBAction func submit_survey_clicked(_ sender: UIButton) {
text_field = self.table_view.viewWithTag(textfield_tag1) as! UITextField
text_field2 = self.table_view.viewWithTag(textfield_tag2) as! UITextField
}
答案 0 :(得分:1)
由于以下几个原因,这不会起作用:
1)重复使用表格视图单元格。因此,您获取第一个项目的单元格并将其指定为标记1,但随后滚动时,该单元格将重新用于说单元格15(仅作为示例),并为标记指定编号15.现在具有标记的SAME文本字段1有标签15。
2)您正在查看包含文本字段标记的视图的表视图,但文本字段不是它属于单元格的表视图的子视图,因此永远不会找到它。
修改
这是使用数据模型Basic Data Model Example
的一个非常基本的示例(注意:这永远不会有效,我可能会在一周左右删除它)
(另请注意:这是一个非常基本的示例,而不是最完整的方法,具有适当的验证等)。
修改强>
如果要列出为数据列表中的每个唯一条目输入的值,可以使用字典。这是一个基于您在评论中提供的详细信息的示例:
首先更改textfieldId结构,使其采用Hashable协议,因此可以用作字典中的键,如下所示:
struct textfieldId: Hashable {
var srno:Int
var pest_code:Int
var inspection_no:Int
var hashValue: Int {
return srno.hashValue ^ pest_code.hashValue ^ inspection_no.hashValue
}
static func ==(lhs: textfieldId, rhs: textfieldId) -> Bool {
return lhs.srno == rhs.srno && lhs.pest_code == rhs.pest_code && lhs.inspection_no == rhs.inspection_no
}
}
然后定义一个字典来保存为每个数据项输入的详细信息,如下所示:
var enteredValues: [textfieldId: String] = [:]
现在,只要输入的文字发生变化,您就可以将其存储在字典中,如下所示:
self.enteredValues[id] = textEntered // Update for your project
并再次获取信息(例如更新单元格)执行以下操作:
cell.textField.text = self.enteredValues[id] // Update for your project.
执行此操作您已创建已输入的值的字典,该字典对每个数据项都是唯一的。
如果您需要清除列表,可以执行以下操作:
self.enteredValues.removeAll()
或创建一个这样的新实例:
self.enteredValues = [:]
答案 1 :(得分:0)
您必须在cell forsizeitem中指定indexPath.row。喜欢这个
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SurveyFormTableViewCell", for: indexPath) as! SurveyFormTableViewCell
var pest_code = textfield_id_value[indexPath.row].pest_code
var srno = textfield_id_value[indexPath.row].srno
var inspection_no = textfield_id_value[indexPath.row].inspection_no
cell.text_field.layer.cornerRadius = 3
cell.text_field.layer.borderWidth = 1
cell.text_field.addTarget(self, action: #selector(tableFieldDidChange(_textField:)), for: .editingChanged)
let id:Int = Int("\(srno)\(pest_code)\(inspection_no)")!
cell.text_field.tag = indexPath.row
cell.label?.text = struc_array[indexPath.item].pest
cell.label?.numberOfLines = 0
cell.label?.lineBreakMode = NSLineBreakMode.byWordWrapping
cell.layer.borderWidth = 1
return cell
}