prepareforsegue perform pass for data change ios swift segue

ios - perform - segue swift 4



Llamar a performSeguewithIdentifier no llama a shouldperformseguewithIdentifier (4)

Como la respuesta anterior. Si llama a performSegueWithIdentifier entonces shouldPerformSegueWithIdentifier no se llama.

Como ejemplo:

Supongamos que tiene un segue incrustado dentro de una vista de contenedor para mostrar algunas imágenes que puede deslizar. Y los segmentos incrustados se activan de inmediato cuando su VC se ha cargado. Pero si tuviera que descargar las imágenes de una API remota su aplicación se bloquearía ya que no habría imágenes para mostrar en la vista incrustada / contenedor incrustada.

En este caso shouldPerformSegueWithIdentifier sería necesario.

Puede configurar un valor booleano que shouldPerformSegueWithIdentifier si su falso devuelve falso y su segue no se disparará. Y una vez que su aplicación haya descargado las imágenes, puede llamar a performSegueWithIdentifier

Tengo dos controladores de vista. En vista controlador1 tengo lo siguiente:

  • una transición que me lleva a viewcontroller2 - esta segue se llama "showme" y se adjunta al viewcontroller
  • un IBAction para un UIButton

En mi código tengo lo siguiente para la acción de presionar el botón

@IBAction func buttonPress(sender: AnyObject) { println("button pressed") performSegueWithIdentifier("showme", sender: self) }

También tengo el siguiente método:

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool { println("Should performing....") return true }

Por algún motivo, nunca se llama a la función shouldPerformSegueWithIdentifier. Sin embargo, si agrego el segue directamente en el UIButton a ViewController2, lo es.

He confirmado que funciona la dirección de invocación dentro de mi botón (ver a continuación), pero esto no es lo que entiendo que es la forma en que funciona. Lo mismo es cierto para prepareforSegue ..

@IBAction func buttonPress(sender: AnyObject) { println("button pressed") if (shouldPerformSegueWithIdentifier("showme", sender: self)){ performSegueWithIdentifier("showme", sender: self)} }


Este comportamiento es perfectamente natural, por las siguientes razones:

1) shouldPerformSegueWithIdentifier se usa para asegurarse de que se haya activado un segue que se haya configurado en Storyboards , por lo que solo se llama en el caso de Segmentos de guiones gráficos y le da la oportunidad de no realizar realmente el segue.

2) Cuando llame a performSegueWithIdentifier usted mismo, shouldPerformSegueWithIdentifier no se llama porque se puede suponer que sabe lo que está haciendo. No tendría sentido llamar a performSegueWithIdentifier pero luego devolver un NO desde shouldPerformSegueWithIdentifier .


La respuesta @nburk es absolutamente correcta.

Sin embargo, entiendo que en algunas situaciones podría ser útil si shouldPerformSegueWithIdentifier:sender: se llamaría de todos modos, también cuando se realiza una llamada para performSegueWithIdentifier:sender: en código.

Por ejemplo, queremos hacer algunas validaciones para decidir si se realiza un segue o no y queremos mantener esta lógica en un solo lugar y no duplicar en todas las condiciones de lugar como las siguientes:

if (self.shouldPerformSegue) { [self performSegueWithIdentifier:identifier sender:sender]; }

Esto se puede lograr fácilmente anulando performSegueWithIdentifier:sender: siguiente manera:

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender { if ([self shouldPerformSegueWithIdentifier:identifier sender:sender]) { [super performSegueWithIdentifier:identifier sender:sender]; } // otherwise do nothing } - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { return self.shouldPerformSegue; }

De esta forma puede usar shouldPerformSegueWithIdentifier:sender: para definir su lógica para permitir / denegar tanto IB como el código desencadenado.


si usa este código, debe eliminarlo;

[self performSegueWithIdentifier:name sender:sender];