UIAlertController-action внутри «удаления метода tableViewCell» - PullRequest
0 голосов
/ 09 ноября 2018

Извините, если это выглядит как дубликат, я видел подобные вопросы здесь, я просто не мог заставить их ответы работать:

У меня есть tableView со списком созданных пользователем объектов realmObject. Моя текущая функция удаления выглядит следующим образом (и прекрасно работает):

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        let realm = try! Realm()
        try! realm.write {
            realm.delete(allDiaries[indexPath.row])
        }
        tableView.deleteRows(at: [indexPath], with: .fade)
}
}

Моя проблема в том, что я не хочу, чтобы появилось сообщение «Вы уверены, что не хотите удалять?» - всплывающее окно с двумя вариантами; "Да, удали!" & "Нет, спасибо."

Я могу легко создать UIAlertController и заставить его отображать его, когда я перемещаю, чтобы удалить ячейку или нажимаю кнопку удаления - но глупо, что ячейка удаляется в ту же секунду, когда нажата кнопка удаления и только после этого (полностью бесполезный!) всплывает UIAlertController - и неважно, что вы нажимаете, он просто исчезает и ячейка удаляется. Моя текущая попытка:

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    let alert = UIAlertController(title: "Are you sure you wish to delete diary?", message: "", preferredStyle: .alert)
    let action = UIAlertAction(title: "No thanks!", style: .cancel) 
    let action1 = UIAlertAction(title: "Delete!", style: .destructive)// <-- handler: 'deletefunction'
    alert.addAction(action)
    alert.addAction(action1)

    if editingStyle == .delete {

        present(alert, animated: true)

        let realm = try! Realm()
        try! realm.write {
            realm.delete(allDiaries[indexPath.row])
        }
        tableView.deleteRows(at: [indexPath], with: .fade)
    }
}
}

Так что, очевидно, я не хочу перемещать «delete-tableViewCell-method» внутри «Action1» (кнопка «Delete» в pop-alert!) И от самой кнопки «delete». <- Это должно показать ТОЛЬКО всплывающее предупреждение! </p>

Я предполагаю, что у меня должен быть этот 'delete-tableViewCell-method' внутри обработчика - но я просто не могу переместить метод из этого tableView-метода для создания обработчика без жалоб xCode. Так как мне создать обработчик и правильно его вставить?

Спасибо! :)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы можете просто использовать замыкания для возврата значения, которое можно выбрать или нет из одного отдельного метода. Проверьте код ниже.

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        self.showDeleteCellAlert { (boolValue) in
            if boolValue {
                tableView.deleteRows(at: [indexPath], with: .fade)
            }
        }
    }
}

private func showDeleteCellAlert(sucess: @escaping ((Bool) -> Void)) {
    let alert = UIAlertController(title: "Are you sure you wish to delete diary?", message: "", preferredStyle: .alert)
    let action = UIAlertAction(title: "No thanks!", style: .cancel) { (_) in
        sucess(false)
    }
    let action1 = UIAlertAction(title: "Delete!", style: .cancel) { (_) in
        sucess(true)
    }
    alert.addAction(action)
    alert.addAction(action1)
    self.present(alert, animated: true, completion: nil)
}
0 голосов
/ 09 ноября 2018

нравится

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

 if editingStyle == .delete {
let alert = UIAlertController(title: "Are you sure you wish to delete diary?", message: "", preferredStyle: .alert)
let action = UIAlertAction(title: "No thanks!", style: .cancel) 
let action1 = UIAlertAction(title: "Delete!", style: .destructive, handler: { _ in
         let realm = try! Realm()
    try! realm.write {
        realm.delete(allDiaries[indexPath.row])
    }
    tableView.deleteRows(at: [indexPath], with: .fade)
    })
alert.addAction(action)
alert.addAction(action1)
    present(alert, animated: true)
}
}
...