我是Swift的新手(以及一般的编程)。我在使用登录功能的Xcode方面遇到了一些困难。我想要的是,如果没有返回错误,用户应该登录,并且应该将用户发送到另一个控制器。我已经阅读了Apple和performSegueWithIdentifier
的一些文档(当然还有一些问题),但是当我使用带有push
或modal
的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实例管理时使用。
答案 0 :(得分:4)
将用户发送到另一个View Controller有两种主要方法。第一个是 performSegueWithIdentifier 。以下是您将如何使用它:
首先,控制 - 从原始VC的黄色圆圈拖动到界面构建器中的目标VC。
接下来,点击' segue箭头'出现在两个视图控制器之间。
在标识符字段中,输入 mySegue 。
接下来,回到您的代码。当您到达登录部分时,请添加以下代码:
self.performSegueWithIdentifier("mySegue", sender: nil)
第二种方法更先进一些。以下是如何运作的:
首先,单击目标VC的黄色圆圈。点击报纸,然后调用故事板ID myVC 。
请务必点击故事板ID
返回代码的相同部分并复制并粘贴此代码:
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
,而是设置故事板。这是一个例子:
UINavigationController
两个UIViewControllers
UINavigationController
到中间UIViewControllers
之间拖动,然后从弹出菜单中选择root view controller
UIViewController
到最后UIViewControllers
之间拖动并选择show
UIViewControllers
并将类名(在身份检查器中)更改为登录视图控制器类。控制拖动菜单(步骤2):
Segue属性检查器(步骤4):
答案 2 :(得分:0)
我发现这里提到的答案非常优雅。 https://fluffy.es/how-to-transition-from-login-screen-to-tab-bar-controller/
它与制表符栏和导航栏一起使用。您可以在场景委托中创建一个函数,该函数可以切换根视图控制器。您可以使用(UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?