iOS如何在dismissController时更改rootViewController
Posted
技术标签:
【中文标题】iOS如何在dismissController时更改rootViewController【英文标题】:iOS how to change rootViewController when dismissController 【发布时间】:2016-06-13 04:50:32 【问题描述】:我的故事板
如果用户没有登录,rootViewController 是Login
用户登录后,rootViewController 为 MainTabBarController
我已经做到了
但是,我遇到的问题是Logout
我的Logout
是dismissViewController
如果我的 rootViewController 是 Login
,它可以工作
它会移除当前的ViewController,所以Login
出现
但是当我的 rootViewController 是 MainTabBarController
时,dismiss 是行不通的,我尝试使用 poptoRootViewController
是徒劳的。
我应该在Logout
做什么?
我想这样做
dismissController(true,
rootViewController = `Login`
)
【问题讨论】:
注销后更好的获取 appDelegate.window.rootViewController 并将其设置为 LoginViewController 为什么不使用 unwind segue? 【参考方案1】:对于注销,请执行以下操作:-(在调用注销的 IBAction 或 didSelect ..etc 方法中添加以下代码)
// Making Login as rootViewController as user is no longer logged in
NSUserDefaults.standardUserDefaults().setBool(false, forKey: "isUserLoggedIn")
NSUserDefaults.standardUserDefaults().synchronize()
let loginVC = self.storyboard?.instantiateViewControllerWithIdentifier("Login") as! loginViewController
let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDel.window?.rootViewController = loginVC
还在 AppDelegate 中添加以下内容:-
// Checking user login status, if user already logged in then making main tab bar view controller as root view controller
let userLoginStatus = NSUserDefaults.standardUserDefaults().boolForKey("isUserLoggedIn")
if(userLoginStatus)
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let centerVC = mainStoryBoard.instantiateViewControllerWithIdentifier("MainTabBar") as! ViewController
window!.rootViewController = centerVC
window!.makeKeyAndVisible()
还有在验证用户凭据后完成登录验证的地方:-
@IBAction func loginTapped(sender: AnyObject)
let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let centerVC = mainStoryBoard.instantiateViewControllerWithIdentifier("MainTabBar") as! ViewController
// Important to set status to true
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isUserLoggedIn")
NSUserDefaults.standardUserDefaults().synchronize()
appDel.window!.rootViewController = centerVC
appDel.window!.makeKeyAndVisible()
注意:-不要忘记为所需的视图控制器添加 STORYBOARD ID 以实例化它们
【讨论】:
【参考方案2】:您只需要在 AppDelegate 中创建一个函数并在注销时调用该函数。
例如(Obj-C 版本)
- (void) setCurrentRootController : (UIViewController *)viewController
[[[UIApplication sharedApplication].delegate window] setRootViewController:nil];
UINavigationController *navigation = [[UINavigationController alloc]initWithRootViewController:viewController];
[[[UIApplication sharedApplication].delegate window] setRootViewController:navigation];
注销时只需要设置rootViewController,然后调用popToRootViewController方法即可。
希望这对你有用!!
【讨论】:
【参考方案3】:您不需要使用任何额外的技术在运行时设置 rootViewController,除了以下内容:
UIApplication.sharedApplication().keyWindow?.rootViewController = viewController;
如果你愿意,你可以用动画包装它
【讨论】:
【参考方案4】:在 Swift 中你可以这样做
let vc: UIViewController! = self.storyboard!.instantiateViewControllerWithIdentifier("LoginViewController")
let window = UIApplication.sharedApplication().windows[0];
window.rootViewController = vc;
【讨论】:
【参考方案5】:您可以维护两个窗口,一个用于登录,第二个用于通过身份验证的用户。
通过这种方式,您可以轻松切换 btw 窗口,而不是使用凌乱的 MVC。
【讨论】:
【参考方案6】:警告,如果您使用 Delegate 或 Completion 方法,请确保您在主线程中。
Swift 3 中的代码
DispatchQueue.main.async
guard let tb = self.storyboard?.instantiateViewController(withIdentifier: "LoggedUser") as? UITabBarController else
print("Could not instantiate view controller with identifier of type LoggedUser")
return
self.present(tb, animated: true, completion: nil)
【讨论】:
以上是关于iOS如何在dismissController时更改rootViewController的主要内容,如果未能解决你的问题,请参考以下文章