滚动后UITableViewCell标记会发生变化

时间:2018-01-09 18:15:22

标签: ios swift uitableview uitextfield

我正在UITableView创建一个表单。此表单在原型单元格中有UILabelUITextField。每个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
}

2 个答案:

答案 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
}