我有不同的 Storyboard,称为 Main、tabBar、home、map 等。在 tabBar Storyboard中,我使用了 SWRevealViewController View 并作为初始 View 启动。 在主 Storyboard 中,只使用了两个,即登录和注册 Controller 。
我的问题是,当用户注销并返回时,它会自动转到主屏幕而不是登录屏幕 [这个问题是由于 SWRevealViewController 是初始 View Controller ]。
我试过的代码:在签名 View Controller 中
在 viewDidAppear 中检查用户是否在 firebase 中可用
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if API.User.CURRENT_USER != nil {
// segue to the Tab Bar Controller
self.performSegue(withIdentifier: "signInToTabBar", sender: nil)
}
}
登录操作:
@IBAction func SignInButton(_ sender: Any) {
view.endEditing(true)
guard
let email = emailTextField.text, !email.isEmpty,
let password = passwordTextField.text, !password.isEmpty
else {
self.showErrorAlert(message: "Username or email or passowrd should not be empty")
return
}
// show the progress to the user
ProgressHUD.show("Starting sign-in...", interaction: false)
// use the signIn class method of the AuthService class
AuthService.signIn(email: emailTextField.text!, password: passwordTextField.text!, onSuccess: {
// on success segue to the Tab Bar Controller
API.User.observeCurrentUser { user in
guard let currentUser = Auth.auth().currentUser else {
return
}
PrefsManager.sharedinstance.UIDfirebase = currentUser.uid
PrefsManager.sharedinstance.username = user.username!
PrefsManager.sharedinstance.userEmail = user.email!
PrefsManager.sharedinstance.imageURL = user.profileImageURL!
ProgressHUD.showSuccess("Sucessfully signed in.")
self.performSegue(withIdentifier: "signInToTabBar", sender: nil)
}
}, onError: { errorString in
ProgressHUD.dismiss()
self.showErrorAlert(message: errorString ?? "Server error")
})
}
SWRevealViewController 菜单表我正在列出菜单,如主页、预订、个人资料、注销:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! MenuTableViewCell
cell.menuName.text = menuName[indexPath.row]
cell.menuIcon.image = UIImage(named: menuImage[indexPath.row])
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// tableView.deselectRow(at: indexPath, animated: true)
let row = indexPath.row
if row == 0{
let storyboard = UIStoryboard(name: "Home", bundle: nil)
let obj = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
let navController = UINavigationController(rootViewController: obj)
navController.setViewControllers([obj], animated:true)
navController.tabBarController?.tabBar.isHidden = false
self.revealViewController().setFront(navController, animated: true)
self.revealViewController().setFrontViewPosition(FrontViewPosition.left, animated: true)
} else if row == 1{
let storyboard = UIStoryboard(name: "Bookings", bundle: nil)
let obj = storyboard.instantiateViewController(withIdentifier: "BookingsViewController") as! BookingsViewController
let navController = UINavigationController(rootViewController: obj)
navController.setViewControllers([obj], animated:true)
self.revealViewController().setFront(navController, animated: true)
self.revealViewController().setFrontViewPosition(FrontViewPosition.left, animated: true)
} else if row == 2 {
let storyboard = UIStoryboard(name: "Profile", bundle: nil)
let obj = storyboard.instantiateViewController(withIdentifier: "profileViewController") as! profileViewController
let navController = UINavigationController(rootViewController: obj)
navController.setViewControllers([obj], animated:true)
self.revealViewController().setFront(navController, animated: true)
self.revealViewController().setFrontViewPosition(FrontViewPosition.left, animated: true)
} else if row == 3 {
print(indexPath)
// Log out user from Firebase
AuthService.signOut(onSuccess: {
// Present the Sign In VC
// PrefsManager.sharedinstance.logoutprefences()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let signInVC = storyboard.instantiateViewController(withIdentifier: "signInViewController")
self.present(signInVC, animated: true)
// self.navigationController?.pushViewController(signInVC, animated: true)
}) { (errorMessage) in
ProgressHUD.showError(errorMessage)
}
}
}
在主视图 Controller 中,检查用户是否可用:
override func viewDidAppear(_ animated: Bool) {
if API.User.CURRENT_USER != nil {
// segue to the Tab Bar Controller
self.performSegue(withIdentifier: "signInToTabBar", sender: nil)
}
super.viewDidAppear(true)
self.tabBarController?.tabBar.isHidden = false
}
最佳答案
当您退出应用程序时,您必须像这样将登录 View Controller 设置为 Root View Controller 。
AuthService.signOut(onSuccess: {
// Present the Sign In VC
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let signInVC = storyboard.instantiateViewController(withIdentifier: "signInViewController") as! signInViewController
let nav = UINavigationController(rootViewController:signInVC)
let application = UIApplication.shared.delegate as! AppDelegate
application.window!.rootViewController = nav
}) { (errorMessage) in
ProgressHUD.showError(errorMessage)
}
现在在 AppDelegate.swift 文件中,在 application(_:didFinishLaunchingWithOptions:) 方法中,您必须检查用户是否为 nil。
if API.User.CURRENT_USER != nil {
let mainNav = self.window?.rootViewController as! UINavigationController
let storyBoard = UIStoryboard(name: "tabBar", bundle:nil)
let sWRevealViewController = storyBoard.instantiateViewController(withIdentifier: "SWRevealViewController") as! SWRevealViewController
mainNav.pushViewController(sWRevealViewController, animated: false)
}
注意:请在标识符名称和 View Controller 名称中添加您的 Storyboard ID 和 View Controller 名称。
关于ios - 如何在不询问 iOS Swift 登录的情况下自动登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51551515/