在删除一行UITableView之前发出警告

时间:2017-05-07 16:17:24

标签: ios swift uitableview swift3

这是我尝试创建的代码,但它不起作用,它首先显示打印行,然后创建“警报”,如果我选择是,则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)
}

有什么建议吗?

2 个答案:

答案 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
    }
}

在这种情况下,您不需要存储所选的选项,但如果您需要存储它 - 您可以添加它(也在处理程序中)