ViewController segue和登录

时间:2016-09-04 11:44:24

标签: swift segue viewcontroller firebase-authentication

我是Swift的新手(以及一般的编程)。我在使用登录功能的Xcode方面遇到了一些困难。我想要的是,如果没有返回错误,用户应该登录,并且应该将用户发送到另一个控制器。我已经阅读了Apple和performSegueWithIdentifier的一些文档(当然还有一些问题),但是当我使用带有pushmodal的segue时,它仍然不起作用给出一个标识符。即使凭据不正确,应用程序也会崩溃,或者用户被发送到我的UITabBarController

这是我的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实例管理时使用。

3 个答案:

答案 0 :(得分:4)

将用户发送到另一个View Controller有两种主要方法。第一个是 performSegueWithIdentifier 。以下是您将如何使用它:

  

首先,控制 - 从原始VC的黄色圆圈拖动到界面构建器中的目标VC。

The Yellow Circle

接下来,点击' segue箭头'出现在两个视图控制器之间。

the arrow

标识符字段中,输入 mySegue

here

接下来,回到您的代码。当您到达登录部分时,请添加以下代码:

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

第二种方法更先进一些。以下是如何运作的:

  

首先,单击目标VC的黄色圆圈。点击报纸,然后调用故事板ID myVC

     

请务必点击故事板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)

如果您有任何疑问,请在下方评论。祝你好运!

答案 1 :(得分:0)

以下是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

修改 由于您的问题似乎不是Firebase,而是设置故事板。这是一个例子:

  1. 设置一个UINavigationController两个UIViewControllers
  2. 控制UINavigationController到中间UIViewControllers之间拖动,然后从弹出菜单中选择root view controller
  3. 控制UIViewController到最后UIViewControllers之间拖动并选择show
  4. 选择上一步中添加的segue,并将其标识符(在属性检查器中)更改为MySegue。 5.选择中间UIViewControllers并将类名(在身份检查器中)更改为登录视图控制器类。
  5. 以下是完整设置: full setup

    控制拖动菜单(步骤2):

    step 2

    Segue属性检查器(步骤4):

    step4

答案 2 :(得分:0)

我发现这里提到的答案非常优雅。 https://fluffy.es/how-to-transition-from-login-screen-to-tab-bar-controller/

它与制表符栏和导航栏一起使用。您可以在场景委托中创建一个函数,该函数可以切换根视图控制器。您可以使用(UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?

访问场景代理功能和窗口