Swift 中 HomeVC 退出按钮的导航 rootViewController 问题
Navigation rootViewController issue with HomeVC Sign out Button in Swift
我有主视图控制器,侧面菜单有 ENSideMenu,在主视图控制器中,我有注销按钮。我已经将 ENSideMenu MyNavigationController 作为情节提要中的初始视图控制器。
我想先在应用程序中显示主页,它工作正常,但是当我从登录主页返回主页时主页没有响应.. 一旦我退出然后主页再次响应。
这是我的代码:
在 appdelegate 中:
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 的登录按钮中:
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 作为情节提要中的初始视图控制器。
我需要 homeVc 在登录后响应。
请帮我解决问题。
您正在使用带有 HomeViewController
的自定义 MyNavigationController
进行导航 - 您已经提到,这是您在情节提要中的初始视图。但是......还有另外两个地方,你正在加载 HomeViewController
而没有 MyNavigationController
:
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
中,当您将视图更改为 HomeVC 时)。这会导致保留循环,从而导致内存泄漏。
- 删除所有不需要的
self
s - 当编译器告诉您,您需要添加 self
- 查看第 2 点)并添加 weak self
而不是 strong
.
- 删除编译器警告 - 您已经有 19 个警告,您可以在几分钟内删除所有警告。
我有主视图控制器,侧面菜单有 ENSideMenu,在主视图控制器中,我有注销按钮。我已经将 ENSideMenu MyNavigationController 作为情节提要中的初始视图控制器。
我想先在应用程序中显示主页,它工作正常,但是当我从登录主页返回主页时主页没有响应.. 一旦我退出然后主页再次响应。
这是我的代码:
在 appdelegate 中:
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 的登录按钮中:
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 作为情节提要中的初始视图控制器。
我需要 homeVc 在登录后响应。 请帮我解决问题。
您正在使用带有 HomeViewController
的自定义 MyNavigationController
进行导航 - 您已经提到,这是您在情节提要中的初始视图。但是......还有另外两个地方,你正在加载 HomeViewController
而没有 MyNavigationController
:
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
中,当您将视图更改为 HomeVC 时)。这会导致保留循环,从而导致内存泄漏。 - 删除所有不需要的
self
s - 当编译器告诉您,您需要添加self
- 查看第 2 点)并添加weak self
而不是strong
. - 删除编译器警告 - 您已经有 19 个警告,您可以在几分钟内删除所有警告。