ios - present - change view controller programmatically swift
Problema con llamar a viewWillAppear de la presentaciĆ³n del controlador de vista cuando se presenta uno se descarta (1)
Actualmente tengo un controlador de vista base que dice AVC que presenta otro controlador de vista que dice BVC sobre el contexto actual de esta manera:
let bvc: BVC = sb.instantiateViewControllerWithIdentifier("BVC") as! BVC
bvc.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.presentViewController(bvc, animated: true, completion: nil)
Luego estoy estableciendo un valor en BVC y, al descartar, estoy usando el mismo valor para realizar una función en la vista que aparecerá de AVC. Sin embargo, me di cuenta de que al presentar OverCurrentContext, al descartar, el viewWillAppear no se llama.
¿Cómo hago para arreglar esto? Necesito una vista presentada semitransparente y, por lo tanto, necesitaría utilizar OverCurrentContext.
¡Gracias!
bhalla,
Dos caminos,
Camino 1
Puede hacer uso de delegados y protocolo para esto :)
Declare un protocolo en BVC y confírmelo en AVC. Y cuando termine en BVC, llame al método de protocolo y deje que el AVC descarte BVC y al hacerlo también puede pasar los datos de BVC a AVC.
Ejemplo:
Declare un protocolo como el siguiente en BVC
protocol letsCallParent{
func amDoneHere(dataIwantToPass : String)
}
Declarar una propiedad para contener la referencia del controlador de vista que confirma este protocolo en BVC
var myParent : letsCallParent?
Y cuando termine con BVC y tenga que retirarse, llame al método en delegado y pase los datos que desea pasar :) Ahora sería una buena práctica de codificación esperar que el padre (AVC) descarte BVC en lugar de llamar a despedir a ViewController en auto :)
if let parent = myParent {
parent.amDoneHere("Hi am Done here")
}
En AVC, confirme al protocolo usando
class AVC: UIViewController,letsCallParent{
y después de crear una instancia de BVC antes de presentarla, asigne el yo como myParent de BVC :)
let bvc: BVC = sb.instantiateViewControllerWithIdentifier("BVC") as! BVC
bvc.myParent = self
y finalmente implementar el método de protocolo :)
func amDoneHere(dataIwantToPass: String) {
print("/(dataIwantToPass)")
//if you want to dismiss BVC call
//if you have pushed bvc
//self.navigationController?.popToViewController(self, animated: true)
//if you have presented
//self.dismissViewControllerAnimated(true, completion: nil)
}
CAMINO 2
Hacer uso de desenrollar segue :) haciendo uso de desenrollar segue eliminará la necesidad de escribir delegado y protocolos y todo :) también proporciona al controlador de vista padre la oportunidad de acceder también al controlador de vista infantil :) Una vez que tenga acceso al niño VC, que es BVC, puedes leer los datos del mismo :)
Ejemplo:
Declare un desenrollado segue :) Si desea que BVC llame a un método de AVC cuando se oscurece, declare un método de desenrollado segue en AVC :)
@IBAction func cancelChildVC(segue:UIStoryboardSegue) {
let childVC : SecondViewController = segue.sourceViewController as! SecondViewController
print(childVC.name)
self.dismissViewControllerAnimated(true, completion: nil)
}
La firma del método es fija :) Tiene que ser una @IBAcción y debe aceptar segue como parámetro :)
Solo después de declarar este método :) diríjase a su storyboard y seleccione la BVC y mantenga el control y arrastre desde el botón o desde cualquier otra vista que tenga en BVC para descartarlo, a la opción Salir en BVC :)
Mira el gif proporcionado a continuación para una comprensión clara :)
Si lo haces correctamente, verás el método que has declarado en AVC como una opción emergente :) lo seleccionarás :) Eso es :) Siempre que toques el botón o la vista desde la que hayas arrastrado el control hasta Salir , el método en tu AVC se llama :)
En el método de AVC, puede acceder a la instancia BVC porque ahora tiene acceso a la instancia segue :) recuerde el método prepareForSegue para segues directos, esto es similar al de desenrollar segue :)
let childVC : SecondViewController = segue.sourceViewController as! SecondViewController
print(childVC.name)
self.dismissViewControllerAnimated(true, completion: nil)
Observe el uso de " segue.sourceViewController
" una vez que tenga acceso a BVC acceda a sus datos :)
Espero que mi respuesta haya ayudado :)