Я создаю UITableView, который позволяет пользователю добавлять переменное количество данных.Изначально таблица выглядит следующим образом:
Когда пользователь нажимает кнопку «+», я хотел бы добавить новую ячейку с UITextField дляввод данных.Эта новая ячейка представляет собой Custom UITableViewCell, который называется «RecordValueCell».Вот как это выглядит:
//Custom UITableViewCell
class RecordValueCell : UITableViewCell {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var deleteButton: UIButton!
var onButtonTapped : ((_ sender : UIButton)->Void)?
@IBAction func deleteButtonTouched(_ sender: Any) {
guard let senderButton = sender as? UIButton else {
return
}
onButtonTapped?(senderButton)
}
}
Однако, когда я пытаюсь добавить другую ячейку, используя функцию tableView.dequeueReusableCell(withIdentifier: )
, кажется, она возвращаетта же клетка.Вот как выглядит мой пользовательский интерфейс:
Пустое место в верхней части раздела, где должна быть моя новая ячейка.Вот код для добавления ячейки:
func addNewValueCell() {
guard let reusableValueCell = self.tableView.dequeueReusableCell(withIdentifier: "valueCell") as? RecordValueCell else {
fatalError("failed to get reusable cell valueCell")
}
var cell = Cell() //some custom cell Object
//add the gray horizontal line you see in the pictures
reusableValueCell.textField.addBorder(toSide: .Bottom, withColor: UIColor.gray.cgColor, andThickness: 0.5)
reusableValueCell.onButtonTapped = { (sender) in
self.removeValue(sender: sender)
}
cell.cell = reusableValueCell
self.sections[self.sections.count - 1].cells.insert(cell, at: 0)
//When i put a break point at this spot, i find that reusableValueCell is the same object as the cell that is already being used.
tableView.reloadData()
reusableValueCell.prepareForReuse()
}
Когда я отлаживаю его, я обнаруживаю, что dequeueReusableCell(withIdentifier: )
возвращает один и тот же RecordValueCell несколько раз.
Вот мой cellForRowAt
:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = self.sections[indexPath.section].cells[indexPath.row].cell else {
fatalError("error getting cell")
}
return cell
}
numberOfRowsInSection
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.sections[section].cells.count
}