performsegue perform for example ios iphone facebook swift segue

ios - example - performsegue swift 4



IOS-Cómo segmentar programáticamente usando swift (9)

Estoy creando una aplicación que usa el SDK de Facebook para autenticar a los usuarios. Estoy tratando de consolidar la lógica de Facebook en una clase separada. Aquí está el código (despojado por simplicidad):

import Foundation class FBManager { class func fbSessionStateChane(fbSession:FBSession!, fbSessionState:FBSessionState, error:NSError?){ //... handling all session states FBRequestConnection.startForMeWithCompletionHandler { (conn: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in println("Logged in user: /n/(result)"); let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let loggedInView: UserViewController = storyboard.instantiateViewControllerWithIdentifier("loggedInView") as UserViewController loggedInView.result = result; //todo: segue to the next view??? } } }

Estoy usando el método de clase anterior para verificar los cambios de estado de la sesión, y funciona bien.

P: Una vez que tengo los datos del usuario, ¿cómo puedo pasar a la siguiente vista desde esta clase personalizada?

EDITAR: para ser claros, tengo un segue con identificador en el guión gráfico, y estoy tratando de encontrar una manera de realizar un segue de una clase que no sea el controlador de vista


Esto funcionó para mí.

En primer lugar, proporcione al controlador de vista en su storyboard una ID de Storyboard dentro del inspector de identidad. Luego use el siguiente código de ejemplo (asegurándose de que la clase, el nombre del guión gráfico y el ID del guión gráfico coincidan con los que está usando)

let viewController: UIViewController = UIStoryboard( name: "Main", bundle: nil ).instantiateViewControllerWithIdentifier("ViewController") as UIViewController // .instantiatViewControllerWithIdentifier() returns AnyObject! // this must be downcast to utilize it self.presentViewController(viewController, animated: false, completion: nil)

Para obtener más detalles, consulte http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html mejores deseos


Lo que quiere hacer es realmente importante para las pruebas unitarias. Básicamente, debe crear una pequeña función local en el controlador de vista. Asigne un nombre a la función, solo incluya el performSegueWithIndentifier .

func localFunc() { println("we asked you to do it") performSegueWithIdentifier("doIt", sender: self) }

A continuación, cambie su clase de utilidad FBManager para incluir un inicializador que tome un argumento de una función y una variable para contener la función ViewController que realiza la segue.

public class UtilClass { var yourFunction : () -> () init (someFunction: () -> ()) { self.yourFunction = someFunction println("initialized UtilClass") } public convenience init() { func dummyLog () -> () { println("no action passed") } self.init(dummyLog) } public func doThatThing() -> () { // the facebook login function println("now execute passed function") self.yourFunction() println("did that thing") } }

(El init de conveniencia le permite usar esto en pruebas unitarias sin ejecutar el segue).

Finalmente, donde tienes // todo: pasar a la siguiente vista ???, pon algo en la línea de:

self.yourFunction()

En sus pruebas unitarias, simplemente puede invocarlo como:

let f = UtilClass() f.doThatThing()

donde doThatThing es su fbsessionstatechange y UtilClass es FBManager.

Para su código real, simplemente pase localFunc (sin paréntesis) a la clase FBManager.


Otra opción es usar segue modal

PASO 1: vaya al guión gráfico y dele al controlador de vista una identificación del guión gráfico . Puede encontrar dónde cambiar la ID del guión gráfico en el Inspector de identidad a la derecha. ModalViewController ID del guión gráfico ModalViewController

PASO 2: abra el controlador de vista ''remitente'' (llamémoslo ViewController ) y agregue este código

public class ViewController { override func viewDidLoad() { showModalView() } func showModalView() { if let mvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ModalViewController") as? ModalViewController { self.present(mvc, animated: true, completion: nil) } } }

Tenga en cuenta que el controlador de vista que queremos abrir también se llama ModalViewController

PASO 3: Para cerrar ModalViewController, agréguele esto

public class ModalViewController { @IBAction func closeThisViewController(_ sender: Any?) { self.presentingViewController?.dismiss(animated: true, completion: nil) } }


Puede hacer esto usando la función performSegueWithIdentifier .

Sintaxis:

func performSegueWithIdentifier(identifier: String, sender: AnyObject?)

Ejemplo:

performSegueWithIdentifier("homeScreenVC", sender: nil)


Puedes usar NSNotification

Agregue un método de publicación en su clase personalizada:

NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)

Agregue un observador en su ViewController:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOFReceivedNotication:", name:"NotificationIdentifier", object: nil)

Añadir función en su ViewController:

func methodOFReceivedNotication(notification: NSNotification){ self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self) }


Puedes usar segue así:

self.performSegueWithIdentifier("push", sender: self) override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if segue.identifier == "push" { } }


Si su segue existe en el guión gráfico con un identificador de segue entre sus dos vistas, puede llamarlo mediante programación usando:

performSegue(withIdentifier: "mySegueID", sender: nil)

Para versiones anteriores:

performSegueWithIdentifier("mySegueID", sender: nil)

También puedes hacer:

presentViewController(nextViewController, animated: true, completion: nil)

O si está en un controlador de navegación:

self.navigationController?.pushViewController(nextViewController, animated: true)


Si su segue existe en el guión gráfico con un identificador de segue entre sus dos vistas, puede llamarlo programáticamente usando

self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

Si estás en el controlador de navegación

let viewController = YourViewController(nibName: "YourViewController", bundle: nil) self.navigationController?.pushViewController(viewController, animated: true)

Te recomendaré para un segundo enfoque usando el controlador de navegación.


Swift 3 : también funciona con SpriteKit

Puede usar NSNotification .

Ejemplo:

1.) Crea un segue en el guión gráfico y nombra el identificador "segue"

2.) Cree una función en el ViewController del que está segue.

func goToDifferentView() { self.performSegue(withIdentifier: "segue", sender: self) }

3.) En el ViewDidLoad () de su ViewController está segue de crear el observador.

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)

Actualización : la última vez que usé esto tuve que cambiar la llamada .addObserver al siguiente código para silenciar los errores.

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)

4.) En el ViewController o Scene al que está siguiendo, agregue el Método de publicación donde quiera que se desencadene la segue.

NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)

Actualización : la última vez que usé esto tuve que cambiar la llamada .post al siguiente código para silenciar los errores.

NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "segue"), object: nil) as Notification)