2016-09-04 2 views
3

Я новичок в Swift (и программировании в целом). У меня возникли трудности с Xcode с функцией входа. Я хочу, чтобы пользователь вошел в систему, если ошибки не были возвращены, и пользователь должен быть отправлен на другой контроллер. Я прочитал часть документации от Apple и performSegueWithIdentifier (и, конечно, некоторые вопросы заданы здесь), но она по-прежнему не работает, когда я использую segue с push или modal, которым присваивается идентификатор. Либо приложение сбой, либо пользователь отправляется на мой UITabBarController, даже если учетные данные были неверными.ViewController segue и login

Это мой LogInViewController.swift:

@IBAction func loginAction(sender: AnyObject) 
{ 
    if self.emailField.text == "" || self.passwordField.text == "" 
    { 
     let alertController = UIAlertController(title: "Oops!", message: "Please enter an email and password.", preferredStyle: .Alert) 

     let defaultAction = UIAlertAction(title: "OK", style: .Cancel, handler: nil) 
     alertController.addAction(defaultAction) 

     self.presentViewController(alertController, animated: true, completion: nil) 
    } 
    else 
    { 
     FIRAuth.auth()?.signInWithEmail(self.emailField.text!, password: self.passwordField.text!) { (user, error) in 

      if error == nil 
      { 
       self.emailField.text = "" 
       self.passwordField.text = "" 
      } 
      else 
      { 
       let alertController = UIAlertController(title: "Oops!", message: error?.localizedDescription, preferredStyle: .Alert) 

       let defaultAction = UIAlertAction(title: "OK", style: .Cancel, handler: nil) 
       alertController.addAction(defaultAction) 

       self.presentViewController(alertController, animated: true, completion: nil) 
      } 
      // User Logged in 
       self.performSegueWithIdentifier("LoggedIn", sender: self) 
     } 
    } 
} 

Я получаю ошибку в консоли:

2016-09-04 14: 55: 30.019 DrinkApp [37777: 1006336] ** * Завершение приложения из-за неперехваченного исключения «NSGenericException», причина: «Не удалось найти контроллер навигации для segue« LoggedIn ». Push segues может использоваться только тогда, когда управляющий источник управляется экземпляром UINavigationController. '

ответ

-1

Вот пример Firebase Логин:

func login() { 
     FIRAuth.auth()?.signInWithEmail(textFieldLoginEmail.text!, password: textFieldLoginPassword.text!) { (user, error) in 
      if error != nil { 
       let alert = UIAlertController(title: "User Authentication error", 
               message: error?.localizedDescription, 
               preferredStyle: .Alert) 
       let OKAction = UIAlertAction(title: "OK", 
              style: .Default) { (action: UIAlertAction!) -> Void in 
       } 
       let resetPasswordAction = UIAlertAction(title: "OK", 
                 style: .Default) { (action: UIAlertAction!) -> Void in 
       } 
       alert.addAction(OKAction) 
       guard let errorCode = FIRAuthErrorCode(rawValue: (error?.code)!) else { return } 
       switch errorCode { 
       case .ErrorCodeWrongPassword: 
        alert.addAction(resetPasswordAction) 
       case .ErrorCodeNetworkError: 
        print("Network error") 
       default: 
        print("Other error\n") 
        break 
       } 
       self.presentViewController(alert, animated: true, completion: nil) 
      } else { // User Logged in 
       self.performSegueWithIdentifier("MySegue", sender: self) 
      } 
     } 
    } 

Я только обрабатываются две ошибки для этого примера.

Если вы используете push segue, вам нужно иметь Навигационный контроллер, и ваш root segue должен привести к login view controller, затем еще segue к контроллеру следующего вида. Этот последний segue должен иметь идентификатор (в данном случае это MySegue)

Edit: Так как кажется, что ваша проблема не связана с Firebase, но с настройкой раскадровку. Вот пример:

  1. Установить один UINavigationController два UIViewControllers
  2. управления Перетащите между UINavigationController к среднему UIViewControllers и выберите root view controller из всплывающего меню
  3. управления Перетащите между UIViewController к последний UIViewControllers и выберите show
  4. выберите segue, добавленный в previo мы шаг и изменим его идентификатор (в инспекторе атрибутов) на MySegue. 5.Выберите Среднее значение UIViewControllers и измените имя класса (в инспекторе идентификации) в класс контроллера входа в систему.

Вот полная установка: full setup

меню управления сопротивления (шаг 2):

step 2

Segue атрибутов инспектору (этап 4):

step4

+0

Спасибо, но я все еще не понимаю. Я добавил performSegueWithIdentifier: self.presentViewController (alertController, анимированное: правда, завершающий: ноль) } // Пользователь Помнить self.performSegueWithIdentifier ("LoggedIn", отправителе: Я) Но я получаю это в консоль: 2016-09-04 14:20:56.968 DrinkApp [35936: 985848] *** Завершение приложения из-за неотображенного исключения «NSGenericException», причина: «Не удалось найти контроллер навигации для segue« LoggedIn ». Push segues может использоваться только тогда, когда управляющий источник управляется экземпляром UINavigationController. ' – Joesoes

3

Есть t wo основные способы отправки пользователя в другой контроллер просмотра. Первый - performSegueWithIdentifier. Вот как вы могли бы воспользоваться этим:

Прежде всего, перетащите элемент управления из желтого круга исходного VC в целевой VC в построителе интерфейса.

The Yellow Circle

Далее, нажмите на 'SEGUE стрелки', которая появляется между двумя контроллерами View.

the arrow

В идентификатор поля, типа в mySegue.

here

Затем вернитесь в ваш код. Когда вы достигнете знака, добавьте следующий код:

self.performSegueWithIdentifier("mySegue", sender: nil) 

Второй способ немного более продвинутый. Вот как это будет работать:

Сначала нажмите на желтый круг назначения VC. Нажмите на газету, затем позвоните в раскадровку IDmyVC.

забудьте нажать на раскадровки ID

here

Вернитесь к той же части кода и скопировать и вставить этот код:

let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let initViewController: UIViewController = storyboard.instantiateViewControllerWithIdentifier("myVC") as UIViewController 
    self.presentViewController(initViewController, animated: true, completion: nil) 

Комментарий вниз если у вас есть вопросы. Удачи!

Смежные вопросы