Swift performSegueWithIdentifier no funciona

Estoy intentando cambiar los controlleres de vista después de que un usuario inicie session con éxito en su count, pero no funciona correctamente. No puedo usar un segue directamente porque si se hace clic en el button de inicio de session, irá al controller de vista independientemente de si la información es correcta o no. He intentado todo lo que sé sin éxito. Este es el código que estoy intentando.

@IBAction func loginTapped(sender: AnyObject) { let username = usernameField.text let password = passwordField.text if username.isEmpty || password.isEmpty { var emptyFieldsError:UIAlertView = UIAlertView(title: "Please try again", message: "Please fill in all the fields we can get you logged in to your account.", delegate: self, cancelButtonTitle: "Try again") emptyFieldsError.show() } PFUser.logInWithUsernameInBackground(username, password:password) { (user: PFUser?, error: NSError?) -> Void in if user != nil { self.performSegueWithIdentifier("Klikur", sender: self) } else { if let errorString = error!.userInfo?["error"] as? String { self.errorMessage = errorString } self.alertView("Please try again", message: "The username password combiation you have given us does not match our records, please try again.", buttonName: "Try again") } } } 

Tengo el ID del guión gráfico en "Prueba" y no cambia el controller de vista cuando se ingresa la información correcta. ¿Alguien puede ayudarme a resolver mi problema?

Aquí está el código para LoginViewController Aquí está el panel de atributos para KlikurTableViewController

Tengo el mismo problema con el problema de inicio de session. Probablemente hagamos el mismo tutorial. Después de nombrar su identificador segue, debe replace:

 performSegueWithIdentifier("Klikur", sender: self) 

con:

 dispatch_async(dispatch_get_main_queue()){ self.performSegueWithIdentifier("Klikur", sender: self) } 

El tipo de seque debe configurarse como "show (ej. Push)" en el storyboard segue. Espero que funcione.

[Suponiendo que su código no se cuelga, sino que simplemente falla al segue]

Al less un problema es:

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

debiera ser:

 dispatch_async(dispatch_get_main_queue()) { [unowned self] in self.performSegueWithIdentifier("Test", sender: self) } 

Recuerde que todas las operaciones de interfaz de usuario deben realizarse en la queue del hilo principal. Puedes demostrar que estás en el hilo equivocado al marcar:

 NSThread.isMainThread() // is going to be false in the PF completion handler 

APÉNDICE

Si existe la posibilidad de que self pueda volverse nulo, como ser despedido o desasignado de otra manera porque no es necesario, debe capturarse a sí mismo débilmente como [weak self] no unowned , y usar desenvolver seguro: if let s = self { s.doStuff() } o encadenamiento opcional: self?.doStuff(...)

ADDENDUM 2

Esta parece ser una respuesta popular, por lo que es importante mencionar esta nueva alternativa aquí:

 NSOperationQueue.mainQueue().addOperationWithBlock { [weak self] in self?.performSegueWithIdentifier("Test", sender: self) } 

Tenga en count que https://www.raywenderlich.com/76341/use-nsoperation-nsoperationqueue-swift :

NSOperation vs. Grand Central Dispatch (GCD)

GCD [dispatch_ * calls] es una forma ligera de representar las unidades de trabajo que se van a ejecutar al mismo time.

NSOperation agrega una sobrecarga adicional en comparación con GCD, pero puede agregar dependencia entre varias operaciones y volver a usarlas, cancelarlas o suspenderlas.

ADDENDUM 3

Apple oculta la regla de un solo subprocess aquí:

NOTA

En su mayor parte, usa classs UIKit solo desde el hilo principal de tu aplicación. Esto es particularmente cierto para las classs derivadas de UIResponder o que implican manipular la interfaz de usuario de la aplicación de alguna manera.

Referencia:

https://developer.apple.com/documentation/uikit

El identificador de segue que pase para performSegueWithIdentifier(_:sender:) con performSegueWithIdentifier(_:sender:) debe coincidir exactamente con el ID que le ha dado a la segue en el guión gráfico. Supongo que tienes una segue entre el controller de vista de inicio de session y el controller de vista de éxito, que es como debería ser; si no es así, ctrl + arrastre desde el primero al segundo controller de vista, luego select el ícono de segue en el guión gráfico y establezca su ID en Klikur . No realice la navigation en el button haga clic, como dijo un comentarista, porque eso vence el propósito principal de tener segues, que es dar una indicación visual del flujo de la aplicación en el guión gráfico.

EDIT: Aquí está el código para un controller de vista de inicio de session:

 import UIKit class ViewController: UIViewController { @IBOutlet weak var usernameField: UITextField! @IBOutlet weak var passwordField: UITextField! @IBAction func attemptLogin(sender: AnyObject) { if !usernameField!.text!.isEmpty && !passwordField!.text!.isEmpty { performSegueWithIdentifier("Klikur", sender: self) } } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if "Klikur" == segue.identifier { // Nothing really to do here, since it won't be finetworking unless // shouldPerformSegueWithIdentifier() says it's ok. In a real app, // this is where you'd pass data to the success view controller. } } } 

Y una captura de pantalla de las properties segue de las que estoy hablando: introduzca la descripción de la imagen aquí

swift 3.x

 DispatchQueue.main.async(){ self.performSegue(withIdentifier: "Klikur", sender: self) } 

Compruebe para asegurarse de que está ejecutando el segue en un controller de vista visible.

Este es un caso de borde, pero mi segue no funcionó cuando intenté ejecutarlo en el controller de vista que pertenece a mi UIPageViewController que no estaba visible actualmente. También falló si intenté hacer la segue en todos los controlleres de vista que pertenecen a mi UIPageViewController, incluido el controller de vista actualmente visible. La solución era rastrear qué controller de vista estaba actualmente visible en mi UIPageViewController, y solo realizar el segue en ese controller de vista.

Un ejemplo en un inicio de session. Cuando tenga éxito en su inicio de session después de hacer clic en un button (Acción) puede usar:

 self.performSegue(withIdentifier: "loginSucess", sender: nil) 

Pero si está iniciando la aplicación y tiene las cnetworkingenciales de su llavero, debe usar esto como parte del tema:

 DispatchQueue.main.async(){ self.performSegue(withIdentifier: "sessionSuccess", sender: nil) } 
 DispatchQueue.main.async() { self.performSegue(withIdentifier: "GoToHomeFromSplash", sender: self)` }