更改一个文本字段的值也会无意中更改几个其他文本字段。我该如何防止这种情况?

Posted

技术标签:

【中文标题】更改一个文本字段的值也会无意中更改几个其他文本字段。我该如何防止这种情况?【英文标题】:Changing the value of one textfield changes a couple of other textfields as well, unintentionally. How do I prevent this? 【发布时间】:2018-12-20 09:44:49 【问题描述】:

我有一个自定义表格视图单元格的表格视图。每个单元格都有一个文本字段,我可以在其中填写一些数字数据。我已经设置了一个委托方法,即textFieldDidEndEditing,它在编辑后会将输入到文本字段中的值添加到 swift 哈希表中。

但是,我看到属于另一个完全不同的表格视图单元格的其他一些文本字段现在也具有我输入的相同值。

为了解决这个问题,我尝试添加其他基于委托的文本字段方法,认为它们应该可以解决手头的问题。我使用的方法之一是 textFieldDidChange 方法,在该方法中,我编写了检查,如果文本字段标签与故意编辑的文本字段的标签不同,则清除文本字段。

func textFieldDidChange(_ textField: UITextField) 
    if textField.tag != self.service!.id 
        print("CLEARING AFFECTED TEXTFIELD")
        textField.text = ""
    

我可能以错误的方式使用了该方法,因为它对问题没有任何影响。

我正在添加涉及手头问题的代码sn-ps:-

BookingServiceChargeViewCell.swift 导入 UIKit 导入 PineKit 导入 SwiftMoment

class BookingServiceChargeViewCell: UITableViewCell, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate 

    //Other variables
    let price = TextField(placeholder: "Price")

    //Other methods
    func layoutContent() 
        //function to set the layout of the cell
        self.price.font = Config.Font.get(.Regular, size: 13)
        self.price.delegate = self
        self.price.setValue(UIColor.init(colorLiteralRed: 71/255, green: 72/255, blue: 73/255, alpha: 1.0), forKeyPath: "_placeholderLabel.textColor")
        self.price.keyboardType = UIKeyboardType.numberPad
        self.price.addDoneButtonOnKeyboard()
        self.price.setBottomBorder()
        self.price.snp.makeConstraints  (make) in
            make.centerY.equalTo(cover)
            make.width.equalTo(75)
            make.right.equalTo(content.snp.right).offset(-40)
        
    

    func configure(_ service: Service, subServices: [Service], index: Int, parentView: OnboardingChosenServicesViewController) 
        self.service = service
        self.subServices = subServices
        self.itemIndex = index
        self.parentView = parentView

        if (self.service!.defaultImage != nil)
            ImageLoader.sharedLoader.imageForUrl(urlString: self.service!.defaultImage!)  (image, url) in
                self.cover.image = image
            
        

        self.serviceName.text = self.service!.name!
        self.price.tag = self.service!.id
        self.table.reloadData()
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.subServices.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BookingSubServicesChargeViewCell
        cell.configure(self.subServices[indexPath.row], index: indexPath.row, parentView: self.parentView!)
        return cell
    

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 80
    

    func textFieldDidEndEditing(_ textField: UITextField) 
        self.parentView!.serviceAndCharges[textField.tag] = Int(textField.text!)
        print(self.parentView!.serviceAndCharges)
    

我正在上传几个显示问题的屏幕截图:-

如您所见,我在“日托”单元格中的文本字段中输入了一个数值

在此屏幕截图中,“Walking”单元格中的文本字段根本不应该被编辑,它应该像所有其他文本字段一样保持空白,除了我刚刚编辑的那个。

我该如何解决这个问题?

【问题讨论】:

这是一个单元重用问题。您需要维护一个正确的数据源,并在每次出列时使用该数据源填充单元格中的文本字段。 @Rakesha Shastri:这个问题是否与我在自定义 TableViewCell 中有一个 UITableView 的事实有关? 这与您正在重用的自定义单元格有关。查看解释单元重用的线程。这些会有所帮助。 ***.com/questions/52100899/…, ***.com/questions/50916739/… @Rakesha Shastri:我查看了您的链接,这与我面临的问题完全相同。谢谢伙计! :) 我确实赞成你的回答伙伴。有链接的那个 【参考方案1】:

当您将具有相同标识符的单元格出列时会出现此问题。要解决此问题,您必须将单元格中写入的值保存在某些数据集中,并在 cellForRow 方法中重新加载表格视图时,使用该数据集配置您的单元格。

您可以通过在您的 CustomCell 中创建一个委托并将您的自定义单元格作为您单元格中存在的文本字段的委托来做到这一点,当文本字段结束编辑时,您可以通过委托将这些值传递给您的控制器并保存这些值在数据源中。在加载您的表格视图时,使用该数据源来配置您的单元格

【讨论】:

以上是关于更改一个文本字段的值也会无意中更改几个其他文本字段。我该如何防止这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

如果超出范围,防止 jQuery UI datepicker 更改文本字段的值

如何同步组合框和文本字段值。即如何从存储在文本字段中加载不同的值,而我正在更改组合框上的值

编辑时如何更改 UITextField

JSFL - 更改静态文本值

文本字段更改的值未在 OnSubmit 中更新 - React-Hook-Form 和 React Js

当textfield为空时禁用按钮等待其他文本字段中的任何更改