Все еще очень быстрый Noob, я искал подходящий способ/лучшую практику для управления удалением строк в моем UITableView
(который использует пользовательские UserCell
s) на основе нажимая UIButton
внутри UserCell
, используя делегацию, которая, кажется, является самым чистым способом сделать это.Правильно делегировать действие кнопки из пользовательской ячейки, чтобы удалить строки в UITableView
Я последовал этому примеру: UITableViewCell Buttons with action
То, что я
UserCell класс
protocol UserCellDelegate {
func didPressButton(_ tag: Int)
}
class UserCell: UITableViewCell {
var delegate: UserCellDelegate?
let addButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("Add +", for: .normal)
button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
addSubview(addButton)
addButton.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -6).isActive = true
addButton.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
addButton.heightAnchor.constraint(equalToConstant: self.frame.height/2).isActive = true
addButton.widthAnchor.constraint(equalToConstant: self.frame.width/6).isActive = true
}
func buttonPressed(_ sender: UIButton) {
delegate?.didPressButton(sender.tag)
}
}
TableViewController класс:
class AddFriendsScreenController: UITableViewController, UserCellDelegate {
let cellId = "cellId"
var users = [User]()
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! UserCell
cell.delegate = self
cell.tag = indexPath.row
return cell
}
func didPressButton(_ tag: Int) {
let indexPath = IndexPath(row: tag, section: 0)
users.remove(at: tag)
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
где User
с в users
добавляются с вызовом базы данных в контроллере представления.
Мои вопросы
- Кнопка в каждой строке таблицы View кликабельна, но ничего не делает
- кнопка кажется, интерактивными только при выполнении «длинное нажатие», то есть палец остается на нем в течение 0,5 с
- Будет ли этот метод гарантировать, что
indexPath
будет обновлен и не выйдет из-под контроля? То есть если строка удалена с индексом 0, удалит ли «новую» строку с индексом 0 или удалит строку с индексом 1?
То, что я хочу
Будучи в состоянии нажать на кнопку в каждой строке таблицы, которая будет удалить его из Tableview.
Я, должно быть, получаю что-то нехорошее и очень ценю, если бы рыцарь Свифт мог просветить меня.
Большое спасибо заранее.
спасибо, что указал это, я изменил соответствующим образом, и он отлично работает. Я изменил 'cell.tag' на' cell.addButton.tag' вместо того, что вы предложили, основываясь на том же принципе. Когда вы говорите, что следует избегать использования указательных путей для идентификации ячеек, какие проблемы могут возникнуть в результате потенциального создания и есть ли стандартный/умный подход к нему? Еще раз спасибо ! – Herakleis
Я обновил свой ответ, чтобы предоставить альтернативу использованию 'indexPaths' - с оговоркой. Надеюсь, это поможет в качестве отправной точки! – Olivier
Спасибо @Olivier, это выглядит просто. Вы проверите это! – Herakleis