2016-06-29 81 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

前時用戶正在使用您的應用程序,他們是否通過從LoginViewController繼續訪問SignUpViewController?如果是的話,這聽起來像你想要傳回數據到LoginViewController。我會使用委託來做到這一點。你也可以看看使用放鬆segue – chickenparm

回答

3

而不是傳遞閉包,你可以使用委託嗎?您SignUpViewController可以通知你LoginViewController當一個新用戶註冊,並通過委託方法像這樣

註冊視圖控制器通過新User對象返回:

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

我試過了。在呈現的第一個視圖控制器中,它不會被稱爲函數(您的「userDidSignUp」)。任何建議? –

0

裏面的@IBAction func signUpButtonTapped(sender: UIButton)

嘗試使用此函數來完成過渡到另一個視圖控制器:

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

不要忘記刪除當前正在使用的self.dismissViewController功能你試試performSegueWithIdentifier

+0

這絕對有效。謝謝。 – jnahum

+0

沒問題!我很高興它現在有效。 –

相關問題