Я пытаюсь создать пустые ячейки покупателя (пользовательские ячейки) в моем табличном представлении, а затем дать пользователю заполнить имена покупателей. Когда пользователь нажимает кнопку удаления для строки / ячейки, он должен удалить соответствующую строку / ячейку независимо от того, заполнено ли текстовое поле для этой строки или нет. Очевидно, я не получаю желаемого поведения. Например, когда я нажимаю delete Row0 (текстовое поле которого говорит «Покупатель 0») и перезагружается табличное представление, Покупатель 0 все еще там, но вместо этого удаляется одна из пустых ячеек Покупателя в конце.
import UIKit
class EntryAlertViewController: UIViewController {
//Fields/Table
@IBOutlet weak var itemField: UITextField!
@IBOutlet weak var priceField: UITextField!
@IBOutlet weak var tableView: UITableView!
//Visual Components
@IBOutlet weak var mainView: UIView!
@IBOutlet weak var titleView: UIView!
@IBOutlet weak var splitItemButton: UIButton!
@IBOutlet weak var cancelButton: UIButton!
@IBOutlet weak var addItemButton: UIButton!
//Commonly Used Objects/Variables
var potentialBuyers: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
potentialBuyers.append("")
tableView.dataSource = self
tableView.register(UINib(nibName: "BuyerCell", bundle: nil), forCellReuseIdentifier: "ReusableCell")
}
override func viewWillAppear(_ animated: Bool) {
}
@IBAction func splitItemPressed(_ sender: UIButton) {
potentialBuyers.append("")
tableView.reloadData()
}
}
Вот источник данных tableview и делегат кнопки удаления.
extension EntryAlertViewController: UITableViewDataSource, DeleteButtonDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return potentialBuyers.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! BuyerCell
cell.deleteButtonDelegate = self
cell.indexPath = indexPath
cell.nameField.text = cell.buyerName
if potentialBuyers.count == 1 {
cell.deleteButton.isHidden = true
} else {
cell.deleteButton.isHidden = false
}
return cell
}
func deletePressed(index: Int) {
potentialBuyers.remove(at: index)
tableView.reloadData()
}
}
А вот мой класс BuyerCell с UITextFieldDelegate в качестве расширения.
import UIKit
protocol DeleteButtonDelegate {
func deletePressed(index: Int)
}
class BuyerCell: UITableViewCell {
@IBOutlet weak var deleteButton: UIButton!
@IBOutlet weak var nameField: UITextField!
var deleteButtonDelegate: DeleteButtonDelegate!
var indexPath: IndexPath!
var buyerName: String?
override func awakeFromNib() {
super.awakeFromNib()
self.nameField.delegate = self
}
@IBAction func deletePressed(_ sender: UIButton) {
//print the indexPath.row that this was pressed for
print("delet pressed for \(indexPath.row)")
self.deleteButtonDelegate?.deletePressed(index: indexPath.row)
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
extension BuyerCell: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
print("textFieldDidBeginEditing")
buyerName = nameField.text
}
func textFieldDidEndEditing(_ textField: UITextField) {
print("textFieldDidEndEditing")
buyerName = nameField.text
}
}