2015-09-21 2 views
4

Моя реализация метода executeSegueWithIdentifier не инициирует segue.performSegueWithIdentifier Не инициирует Segue

Я попытался отлаживать, разместив операторы печати до и после метода: он печатает раньше, но не после, что, очевидно, указывает на то, что метод не работает, правильно?

class ViewController: UIViewController{ 

    var signupActive = true 

    @IBOutlet weak var username: UITextField! 
    @IBOutlet weak var password: UITextField! 

    var errorMessage = "Please try again later" 

    func displayAlert(title: String, message: String) { 

     let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
     alert.addAction((UIAlertAction(title: "Ok", style: .Default, handler: { (action) -> Void in 
      self.dismissViewControllerAnimated(true, completion: nil) 
     }))) 

     self.presentViewController(alert, animated: true, completion: nil) 

    } 

    @IBAction func signUp(sender: AnyObject) { 

     if username.text == "" || password.text == "" { 

      displayAlert("Error in form", message: "Please enter a username and password") 

     } else { 

      UIApplication.sharedApplication().beginIgnoringInteractionEvents() 

      var errorMessage = "Please try again later" 

      if signupActive == true { 

       var user = PFUser() 
       user.username = username.text 
       user.password = password.text 
       user.signUpInBackgroundWithBlock({ (success, error) -> Void in 

        UIApplication.sharedApplication().endIgnoringInteractionEvents() 

        if error == nil { 

         // Right here and below as well 

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


        } else { 

         if let errorString = error!.userInfo["error"] as? String { 

          errorMessage = errorString 

         } 

         self.displayAlert("Failed signup", message: errorMessage) 

        } 
       }) 

      } else { 

       PFUser.logInWithUsernameInBackground(username.text!, password: password.text!, block: { (user, error) -> Void in 

        UIApplication.sharedApplication().endIgnoringInteractionEvents() 

        if user != nil { 

         // Here too 

         print("kay") 
         self.performSegueWithIdentifier("login", sender: self) 
         print("yay") 


        } else { 

         if let errorString = error!.userInfo["error"] as? String { 

          errorMessage = errorString 
         } 

         self.displayAlert("Failed login", message: errorMessage) 

        } 

       }) 
      } 

     } 

    } 
+0

Выполнить отладку сборки вашей программы в Xcode и смотреть консоль отладки. Я предполагаю, что этот вызов вызывает исключение, из-за которого ваша функция завершается. –

+0

@ DuncanC как вы это делаете? Вот что я искал –

+2

В меню «Вид» выберите «Область отладки> Активировать консоль». Затем посмотрите в самый нижний правый угол окна вашего проекта на два маленьких синих квадрата. Убедитесь, что они оба синие, и переместите делитель между двумя частями консоли отладки примерно на полпути между двумя разделами. Затем запустите свою программу и включите соответствующий код. –

ответ

3

Вам необходимо выполнить segue в основном потоке, поскольку в данный момент вы выполняете segue внутри блока.

Чтобы выполнить свой SEGUE на главной теме:

dispatch_async(dispatch_get_main_queue()){ 
      self.performSegueWithIdentifier("login", sender: self) 
} 
+0

черт возьми, вы были 30 секунд, чтобы поститься для меня;) – Glenn

+0

Является ли это новым для iOS 9? –

+2

Хороший улов. Я пропустил это. В OP вы используете функцию синтаксического анализа под названием 'PFUser.logInWithUsernameInBackground'. Это имя метода говорит вам, что это происходит в фоновом режиме. Вы никогда не могли вносить изменения в пользовательский интерфейс в фоновом режиме в любой версии iOS. –