首先,我只是盯着iOS,所以也许这是一个愚蠢的问题,但我无法弄清楚。我正在使用SWRevealViewController
作为侧边栏菜单,我使用delegate
来检测FrontViewPosition
并有这行代码:self.revealViewController().delegate = self
viewDidLoad
并且出现了问题(如果我将这一行放在viewDidAppear
中也是如此(。我正在使用FirebaseAuth
并且有LoginViewController
所以当我第一次登录时会抛出异常
线程 1:致命错误:解开可选值时意外发现 nil
正如我self.revealViewController().delegate = self
所说。当然,我可以通过简单地nil
签入来避免这种情况,但是revealViewController()
将无法正常工作,因为它没有注册。
奇怪的事情,至少对我来说,下次FirebaseAuth
保存我的凭据并且应用程序直接启动后,MainViewController
一切都会正常工作。唯一的问题是当我第一次登录或注销并再次登录时。我performSegue
登录成功后启动MainViewController
。有人可以告诉我问题出在哪里吗?谢谢
我在带有登录屏幕的项目中使用了SWRevealViewController
。
我如何处理用户登录是:
- 将登录视图控制器设置为初始视图控制器。
-
然后检查用户是否已登录或不在
AppDelegate
文件中的didFinishLaunchingWithOptions
内。if (userDefaults.object(forKey:"user") != nil) { let storyboard = UIStoryboard(name: "Main", bundle: nil) self.window?.rootViewController = storyboard.instantiateViewController(withIdentifier: "SWRevealViewController") self.window?.makeKeyAndVisible() }
-
如果用户已经登录,则显示主视图控制器。
-
然后在
MainViewController
viewDidLoad
中添加了下面的代码。// To show Menu if (self.revealViewController() != nil) { menuButton.target = self.revealViewController() menuButton.action = #selector(SWRevealViewController.revealToggle(_:)) self.view.addGestureRecognizer(revealViewController().panGestureRecognizer()) }
我希望这对你有所帮助。
目前我找到了适用于我的方案的解决方案。不过,如果有人知道问题是什么,请解释一下。我很高兴将您的答案标记为正确答案。我不知道是SWRevealViewController
中的错误或我的方法不正确。所以我所做的是:
我检查用户是否登录MainViewController
viewWillAppear
如下所示:
override func viewWillAppear(_ animated: Bool) {
Auth.auth().addStateDidChangeListener() {
auth, user in
if user == nil {
let loginController = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController
self.present(loginController!, animated: true, completion: nil)
}
}
}
之后,当用户成功登录时,我只需dismiss
LoginViewController
并在MainViewController
需要的地方处理用户身份验证。我测试了这种方法似乎有效。我对SignUpViewController
做了同样的事情感谢所有试图提供帮助的人。