ios - Advertencia: intento de presentar<UIAlertController: 0x7facd3946920> en<...> que ya está presentando(nulo)
uitableview swift (3)
Tengo un gesto de prensa prolongado en un UITableView
que presenta un UIAlertController
contiene el texto de la celda. Cuando se presenta el UIAlertController
recibo esta advertencia:
Attempt to present <UIAlertController: 0x7fd57384e8e0> on <TaskAppV2.MainTaskView: 0x7fd571701150> which is already presenting (null)
Desde mi punto de vista, MainTaskView ( UITableView
) ya está presentando una vista, por lo que no debe presentar una segunda vista, el UIAlertController.
Así que probé esta solución a partir de una pregunta similar. No funciona, ya que recibo la misma advertencia. ¿Qué puedo hacer para resolver esta advertencia? Vea a continuación el código:
func longPressedView(gestureRecognizer: UIGestureRecognizer){
/*Get cell info from where user tapped*/
if (gestureRecognizer.state == UIGestureRecognizerState.Ended) {
var tapLocation: CGPoint = gestureRecognizer.locationInView(self.tableView)
var tappedIndexPath: NSIndexPath? = self.tableView.indexPathForRowAtPoint(tapLocation)
if (tappedIndexPath != nil) {
var tappedCell: UITableViewCell? = self.tableView.cellForRowAtIndexPath(tappedIndexPath!)
println("the cell task name is /(tappedCell!.textLabel!.text!)")
} else {
println("You didn''t tap on a cell")
}
}
/*Long press alert*/
let tapAlert = UIAlertController(title: "Long Pressed", message: "You just long pressed the long press view", preferredStyle: UIAlertControllerStyle.Alert)
tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
/*
if (self.presentedViewController == nil) {
self.presentViewController(tapAlert, animated: true, completion: nil)
} else {
println("already presenting a view")
} */
self.presentViewController(tapAlert, animated: true, completion: nil)
println("presented")
}
Salida de la consola:
presented
You didn''t tap on a cell
2015-05-19 22:46:35.692 TaskAppV2[60765:3235207] Warning: Attempt to present <UIAlertController: 0x7fc689e05d80> on <TaskAppV2.MainTaskView: 0x7fc689fc33f0> which is already presenting (null)
presented
Por alguna razón, ambas piezas de código se están ejecutando en la instrucción if cuando ocurre el gesto de presión prolongada. La alerta se presenta y el texto se imprime en la consola. ¿Es esto un problema?
Editar: Como dijo Matt, no tenía todo mi código en el alcance de la prueba del reconocedor de gestos. Mover eso solucionó mi problema. El código fuera de la prueba se estaba ejecutando dos veces, lo que dio como resultado que el UIAlertController
se presentara dos veces.
Por algún motivo, ambos fragmentos de código se ejecutan en el
if
Eso debería haber sonado las campanas de alarma para mí. Es imposible que se ejecuten tanto el if
como el else
. Este código debe ejecutarse dos veces.
Eso es porque no está probando el estado del reconocedor de gestos. Una pulsación larga gr envía su mensaje de acción dos veces . Está ejecutando este código tanto en la pulsación larga como en la versión. Necesita probar el estado de la gr para que no lo haga. Ejemplo:
@IBAction func longPressedView(g: UIGestureRecognizer) {
if g.state == .Began {
// ... do it all here
}
}
He tenido el mismo problema. Pude arreglarlo con este código:
if self.presentedViewController == nil {
self.present(Alert, animated: true, completion: nil)
}
else {
self.dismiss(animated: false, completion: nil)
self.present(Alert, animated: true, completion: nil)
}
Debe diferenciar el estado del gesto y luego ejecutar el código que desea, si no el selector que agrega al objetivo se ejecutará la primera vez cuando el estado del gesto sea UIGestureRecognizerStateBegan
y la segunda vez cuando el estado del gesto sea UIGestureRecognizerStateCancelled
, se UIGestureRecognizerStateCancelled
el segundo rendimiento, alertController, entonces Xcode registrará la advertencia.