我有带 ENSideMenu 的主视图 Controller 用于侧面菜单,在主视图 Controller 中我有注销按钮。我已将 ENSideMenu MyNavigationController 作为 Storyboard 中的初始 View Controller 。
我想先在应用程序中显示主页,该应用程序工作正常,但当我从登录到主页时,主页没有响应。一旦我注销,主页就会再次响应。
这是我的代码:
在应用委托(delegate)中:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
let userId: String? = KeychainWrapper.standard.string(forKey: "Uid")
print("appdelegate userid \(userId)")
if userId != nil{
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let homeVC = mainStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
self.window!.rootViewController = homeVC
}
return true
}
在 LogInVC 的 loginButton 中:
let saveUserId: Bool = KeychainWrapper.standard.set(Uid ?? "", forKey: "Uid")
print("the userid is \(saveUserId)")
if (Uid?.isEmpty)!
{
print("login fail")
}
else{
DispatchQueue.main.async {
let homeVC = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
let appDelagate = UIApplication.shared.delegate
appDelagate?.window??.rootViewController = homeVC
}
}
在 HomeVC 中:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "MakePaymentViewController") as! MakePaymentViewController
self.navigationController?.pushViewController(nextViewController, animated: true)
let indexPathHome = indexPath.row
print("home collectionItem indexpath \(indexPathHome)")
}
@IBAction func signOutButton(_ sender: Any) {
print("signout tapped")
KeychainWrapper.standard.remove(key: "Uid")
}
@IBAction func sideMenuButton(_ sender: Any) {
print("in side menu")
toggleSideMenuView()
}
我已将 ENSideMenu MyNavigationController 作为 Storyboard 中的初始 View Controller 。
我需要 homeVc 在登录后做出响应。 请帮我解决这个问题。
最佳答案
您正在将自定义 MyNavigationController
与 HomeViewController
用于导航目的 - 您已经提到,这是您在 Storyboard 中的初始 View 。但是...还有另外两个地方,您在没有加载 MyNavigationController
的情况下加载 HomeViewController
:
AppDelegate
更改加载HomeViewController
:
let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
window?.rootViewController = mainStoryBoard.instantiateViewController(withIdentifier: "MyNavigationController")
LoginViewController
改变
let homeVC = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
let navigationController = UINavigationController(rootViewController: homeVC)
到
let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
let navigationController = mainStoryBoard.instantiateViewController(withIdentifier: "MyNavigationController")
另外,我有一些建议给你:
- 避免在您的代码中使用
!
- 这是导致您的应用程序崩溃的直接方法。还有很多其他方法可以处理可选值 - 避免在闭包中捕获强
self
(如在LoginViewController
中,当您将 View 更改为 HomeVC 时)。这会导致保留循环,从而导致内存泄漏。 - 删除所有不需要的
self
- 当编译器告诉您,您需要添加self
- 查看第 2 点)并添加weak self
而不是strong
。 - 移除编译器警告 - 您已经有 19 个警告,您可以在几分钟内移除所有警告。
关于swift - Swift 中 HomeVC 退出按钮的导航 rootViewController 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58060024/