ios - performsegue - segue swift 4
Hacer Segue programáticamente en Swift (2)
Tengo dos VCs: VC1 y VC2. En VC1, tengo un finish button
que programé y una result array
que quiero pasar a VC2.
Sé cómo hacer Segue en el Guión gráfico, pero no puedo hacerlo en este momento ya que el finish button
se realiza mediante programación.
Si quiero pasar la matriz de resultados usando segue, ¿hay alguna manera de hacer la segue programáticamente? Si esto no es posible, ¿debería presentar VC2 utilizando presentViewController
y configurar un delegado para que pase la result array
?
Aún puede crear el segmento en Interface Builder arrastrando desde VC1 a VC2, simplemente arrastre desde / hacia el pequeño círculo amarillo en la parte superior de la VC. Asígnele a este segmento un nombre único en IB, y en su función de finish
puede llamar a performSegueWithIdentifier:
pasar el nombre de su segmento y eso es todo. En el método prepareForSegue
puede averiguar qué segue se está realizando accediendo a segue.identifier
, y si es el segmento en cuestión, puede obtener un puntero a segue.destinationViewController
y pasar sus datos de esa manera.
Puede hacerlo como se propone en esta respuesta: InstantiateViewControllerWithIdentifier .
Además, le estoy proporcionando el código de la respuesta vinculada reescrita en Swift porque la respuesta en el enlace fue escrita originalmente en Objective-C.
let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as! SecondViewController
vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)
EDITAR:
Como esta respuesta atrae algo de atención, pensé que le proporcionaba otra manera más segura. En la respuesta anterior, la aplicación se bloqueará si el ViewController
con "identifier" no es del tipo SecondViewController
. En Swift puede evitar este bloqueo mediante el enlace opcional:
guard let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as? SecondViewController else {
print("Could not instantiate view controller with identifier of type SecondViewController")
return
}
vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)
De esta manera, se empuja el ViewController
si es de tipo SecondViewController
. Si no se puede convertir en SecondViewController
, se imprime un mensaje y la aplicación permanece en el ViewController
actual.