这是我尝试创建的代码,但它不起作用,它首先显示打印行,然后创建“警报”,如果我选择是,则iit将删除下次单击“删除”时的行。
// Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// Delete the row from the data source
crearAlertaDoble(titulo: "¿Seguro que deseas eliminar este calendario?", mensaje: "")
print("opcion elegida: \(opcionAlertaMensaje)")
if (opcionAlertaMensaje == 1) {
objetoContenedor.calendarios.remove(at: indexPath.row) //WIP, MOSTRAR MENSAJE SI ESTA SEGURO
tableView.deleteRows(at: [indexPath], with: .fade)
opcionAlertaMensaje = 2
} else {
}
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
这是警报代码:
func crearAlertaDoble(titulo: String, mensaje: String) {
let alert = UIAlertController(title: titulo, message: mensaje, preferredStyle: .alert)
let botonUno = UIAlertAction(title: "NO!", style: UIAlertActionStyle.destructive, handler: { (action) -> Void in
self.opcionAlertaMensaje = 0
} )
let botonDos = UIAlertAction(title: "Si", style: UIAlertActionStyle.default, handler: { (action) -> Void in
self.opcionAlertaMensaje = 1
} )
alert.addAction(botonDos)
alert.addAction(botonUno)
present(alert, animated: true, completion: nil)
}
有什么建议吗?
答案 0 :(得分:3)
显示警报控制器的方法异步工作。调用方法后,您无法同步处理结果。
有几种解决方案,其中之一是添加完成处理程序:
func crearAlertaDoble(titulo: String, mensaje: String, completion:@escaping (Int) ->()) {
let alert = UIAlertController(title: titulo, message: mensaje, preferredStyle: .alert)
let botonUno = UIAlertAction(title: "NO!", style: .destructive, handler: { action in
completion(0)
} )
let botonDos = UIAlertAction(title: "Si", style: .default, handler: { action in
completion(1)
} )
alert.addAction(botonDos)
alert.addAction(botonUno)
present(alert, animated: true, completion: nil)
}
并在tableView:commit:forRowAt:
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// Delete the row from the data source
crearAlertaDoble(titulo: "¿Seguro que deseas eliminar este calendario?", mensaje: "") { result in
print("opcion elegida: \(result)")
if result == 1 {
self.objetoContenedor.calendarios.remove(at: indexPath.row) //WIP, MOSTRAR MENSAJE SI ESTA SEGURO
self.tableView.deleteRows(at: [indexPath], with: .fade)
} else {
}
}
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
答案 1 :(得分:0)
这是因为UIAlertAction在闭包处理程序中删除了。它是异步的。在您的代码中首先运行commitEditing()方法的所有代码,包括删除。只有在用户点击Si或No - 处理程序触发后。但它没有做任何事情,因为删除处理程序没有任何意义。
你可以这样解决:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let alert = UIAlertController(title: "¿Seguro que deseas eliminar este calendario?", message: "", preferredStyle: .alert)
let botonUno = UIAlertAction(title: "NO!", style: UIAlertActionStyle.destructive, handler: { (action) -> Void in
self.opcionAlertaMensaje = 0
} )
let botonDos = UIAlertAction(title: "Si", style: UIAlertActionStyle.default, handler: { (action) -> Void in
self.objetoContenedor.calendarios.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
} )
alert.addAction(botonDos)
alert.addAction(botonUno)
present(alert, animated: true, completion: nil)
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
在这种情况下,您不需要存储所选的选项,但如果您需要存储它 - 您可以添加它(也在处理程序中)