我花了好几天时间来解决这个问题,经过多次努力,我在这里问了一个问题。我正在使用自定义UITableViewCell,该单元格包含UITextFields。在向表视图添加新单元格时,表格视图表现异常,就像复制单元格一样,当我尝试编辑新单元格的文本字段时,前一个单元格的文本字段也会被编辑。
复制行为如下:第3个细胞重复第1个细胞。我不知道这是由于细胞的可重用性,但有人能告诉我有效的解决方案吗?
我附上了UITableViewCell的截图。
cellForRow的代码如下:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell : Product_PriceTableViewCell = tableView.dequeueReusableCell(withIdentifier: "product_priceCell") as! Product_PriceTableViewCell
cell.dropDownViewProducts.index = indexPath.row
cell.txtDescription.index = indexPath.row
cell.tfPrice.index = indexPath.row
cell.dropDownQty.index = indexPath.row
cell.tfTotalPrice_Euro.index = indexPath.row
cell.tfTotalPrice_IDR.index = indexPath.row
cell.dropDownViewTotalDiscount.index = indexPath.row
cell.dropDownViewDeposit.index = indexPath.row
cell.tfTotalDeposit_Euro.index = indexPath.row
cell.tfRemaingAfterDeposit_IDR.index = indexPath.row
return cell
}
答案 0 :(得分:6)
问题是UITableView正在重用单元格,这是您希望获得良好滚动性能的方法。
您应该更新支持表格中每一行的数据源,以保存用户在字段中输入的文本。
然后在cellForRowAt中从数据源中分配文本字段的文本属性。
换句话说,每次在屏幕上看到UITableViewCell都是相同的实例,UITextField也是如此,因此它的文本属性也是如此。这意味着每次调用cellForRowAt时都需要为其分配正确的文本值。
我不确定你的代码所以我提供了一个例子,说明我将如何做你想做的事情:
class MyCell: UITableViewCell {
@IBOutlet weak var inputField: UITextField!
}
class ViewController: UIViewController {
@IBOutlet weak var table: UITableView!
var items = [String]()
fileprivate func setupItems() {
items = ["Duck",
"Cow",
"Deer",
"Potato"
]
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
setupItems()
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// the # of rows will equal the # of items
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// we use the cell's indexPath.row to
// to get the item in the array's text
// and use it as the cell's input field text
guard let cell = tableView.dequeueReusableCell(withIdentifier: "myCell") as? MyCell else {
return UITableViewCell()
}
// now even if the cell is the same instance
// it's field's text is assigned each time
cell.inputField.text = items[indexPath.row]
// Use the tag on UITextField
// to track the indexPath.row that
// it's current being presented for
cell.inputField.tag = indexPath.row
// become the field's delegate
cell.inputField.delegate = self
return cell
}
}
extension ViewController: UITextFieldDelegate {
// or whatever method(s) matches the app's
// input style for this view
func textFieldDidEndEditing(_ textField: UITextField) {
guard let text = textField.text else {
return // nothing to update
}
// use the field's tag
// to update the correct element
items[textField.tag] = text
}
}
答案 1 :(得分:0)
我建议做以下
System.IO.FileFormatException
其中clean是清空视图的功能(取决于类型)
然后在代表中:
class Product_PriceTableViewCell: UITableViewCell {
var indexRow: Int = -1
func configureCell(index: Int) {
cell.dropDownViewProducts.clean()
...
cell.tfRemaingAfterDeposit_IDR.clean()
}
}
当@thefredelement指出当单元格不在视图框架中时,它不会被创建。只有在视图出现时,它才会尝试重用单元格的实例,并且第一个可用时,表视图会使用它,但不会重新初始化它。因此,您必须确保清理数据
答案的其余部分是为了更好的编码。