2016-06-29 2 views
1

Я работаю над приложением iOS, которое регистрирует пользователя в виде входа в систему.Как передать данные при отключении вида контроллера в Swift

Существует два контроллера: LognViewController и SignUpViewController Если вместо этого зарегистрирован новый пользователь, тогда контроллер регистрации открывается вызов API для получения новой учетной записи пользователя. Затем страница «Зарегистрироваться» должна перенести новый объект «Пользователь» обратно на страницу «Вход», которая, в свою очередь, вводит пользователя в основное приложение.

Основано на a previous post Мне нравится идея закрытия, и я пытаюсь ее реализовать здесь; однако, я получаю ноль от переменной функции закрытия. Мой код-то вроде этого:

В первом контроллере:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "userSignUp" { 
     if !self.userTextField.text!.isEmpty { 
      let nav = segue.destinationViewController as! UINavigationController 
      let vc = nav.topViewController as! SignUpViewController 
      vc.email = self.userTextField.text! 
      vc.submitUser = signUpToLogIn 
     } 
    } 
} 


// asynchronous get user back from sign up 
func signUpToLogIn(currentUser: User) { 
    self.currentUser = currentUser 
    self.checkCurrentUser() 
} 

Во втором контроллере:

var submitUser: ((currentUser: User) ->())! 


@IBAction func signUpButtonTapped(sender: UIButton) { 

    doSignUp({(u: User?) ->() in 
     if u != nil { 
      self.submitUser(currentUser: u!) 
      self.dismissViewControllerAnimated(false, completion: nil) 
     } 
    }) 
} 

Я смотрю на отладчик, и он говорит, что фатальная ошибка: неожиданно nil при развертывании необязательного значения. Когда я работаю с точкой останова, я вижу в разделе переменных, что переменная submitUser всегда равна нулю.

Есть ли другой способ сделать это сейчас?

+0

When пользователь использует ваше приложение, они получают доступ к SignUpViewController, переходя из LoginViewController? Если да, похоже, что вы хотите передать данные обратно в LoginViewController. Я бы использовал делегата для этого. Вы также можете изучить использование unind segue – chickenparm

ответ

3

Вместо того чтобы пропустить закрытие, вы можете использовать делегацию вместо этого? Ваш SignUpViewController может уведомить ваше LoginViewController когда новый пользователь подписался и передать новый объект User обратно через метод делегата, как так

Signup View Controller:

protocol SignUpDelegate { 
    func userDidSignUp(u: User) 
} 

class SignUpViewController: UIViewController { 
    var delegate: SignUpDelegate? 

    @IBAction func signUpButtonTapped(sender: UIButton) { 
     // Make async call to sign new user up here 
     // Once you get a User back from your API call your delegate 
     // method in your completion or at the end of your network call 
     self.delegate?.userDidSignUp(newUserObject) 
     self.dismissViewControllerAnimated(false, completion: nil) 
    } 
} 

Затем в контроллере представления входа в систему можно реализовать этот делегат метод

Войти контроллер вид:

class LoginViewController: UIViewController { 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "userSignUp" { 
      if !self.userTextField.text!.isEmpty { 
       let nav = segue.destinationViewController as! UINavigationController 
       let vc = nav.topViewController as! SignUpViewController 
       vc.email = self.userTextField.text! 
       vc.delegate = self 
      } 
     } 
    } 

    // MARK: SignUpDelegate 
    func userDidSignUp(u: User) { 
     // Log user in with new user 
    } 
} 
+0

Это интересная идея. Спасибо. Я могу использовать этот метод во всем остальном приложении! – jnahum

+0

Нет проблем! Рад, что я мог помочь :) – cjrieck

+0

Я попробовал. В первом представлении viewcontroller это не будет называться функцией (ваш «userDidSignUp»). Любое предложение? –

0

Внутри:

Попробуйте использовать эту функцию, чтобы сделать переход к другому контроллеру вид:

[self performSegueWithIdentifier:@"segueIdentifierHere" sender:self];

Не забудьте удалить функцию self.dismissViewController, которую вы используете, прежде чем попробовать performSegueWithIdentifier

+0

Это определенно сработало. Благодарю. – jnahum

+0

Нет проблем! Я рад, что он работает сейчас. –

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