与Instagram非常相似,我的应用程序的主要部分有五个选项卡,其中五个ViewControllers都通过导航控制器连接到一个tabBar控制器。当用户点击“注销”按钮时,我希望能够将用户发送回位于TabBar VC之前的Login VC(如图所示),还可以“销毁”与tabBar控制器关联的任何内容(1 x tabbar VC,5x navigation VC,5x ViewControllers)但是,我不能简单地执行“DismissViewControllerAnimated方法”,因为在启动时,如果用户先前已登录,我将tabBar VC设置为初始VC。这是通过以下方式实现的app delegate中的代码
func tryToLogin() {
if let userUid = NSUserDefaults.standardUserDefaults().valueForKey(KEY_USER_UID) {
print("User Exists in NSUserDefault = \(userUid)")
updateUserGlobalVariables()
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let tabBarVC = storyboard.instantiateViewControllerWithIdentifier("TabBarVC") as! UITabBarController
window?.rootViewController = tabBarVC
}
}
目前,当用户注销时,我“instantiateViewControllerWithIdentifier”返回LoginVC,因为如果用户已经登录,LoginVC可能永远不会出现。但是,当我用其他帐户重新登录时,我的变量中的一些数据被带回,好像VC / TabBarVC永远不会被破坏。这就是我目前如何进入我的LoginVC。
func goToLoginVC() {
let facebookManager = FBSDKLoginManager()
facebookManager.logOut()
do {
try FIRAuth.auth()?.signOut()
self.removeCurrentUserDataFromDisk()
// Dont use dismiss as sometimes the root VC is not login VC
let loginVC = self.storyboard?.instantiateViewControllerWithIdentifier("LoginVC") as! LoginVC
self.presentViewController(loginVC, animated: true) {
self.removeFromParentViewController()
}
} catch let error as NSError {
showErrorAlert("Error", message: "\(error.localizedDescription)")
}
}
所以我想换句话说,我如何实现与dismissViewControllerAnimated相同的结果 1. InstantiateViewControllerWithIdentifier 2.销毁附加tabBarVC
后面遗留的内容这是我的故事板的屏幕截图
由于
答案 0 :(得分:0)
如果您的loginVC已嵌入导航控制器,那么您可以执行类似注销点击
的操作 UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *initialViewController = [storyBoard instantiateViewControllerWithIdentifier:@"loginViewController"];
UINavigationController *nav = [storyBoard instantiateViewControllerWithIdentifier:@"navigationController"];
[nav setViewControllers:[NSArray arrayWithObjects:initialViewController, nil] animated:NO];
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
CATransition* transition = [CATransition animation];
transition.duration = 0.2;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
appDelegate.window.rootViewController = nav;
[appDelegate.window.layer addAnimation:transition forKey:nil ];
我在我的一个项目中这样做。 navigationController
是嵌入在您的第一个LoginViewController中的UINavigationController
的故事板标识符。您已将问题Objective C
标记为我已编写对象代码段,如果有帮助的话。 :)
答案 1 :(得分:0)
为了实现这样的流程,我在一些容器视图控制器中使用UITabbar元素,并以编程方式将所有子控制器添加到tabbar。在不同选项卡选择的视图控制器之间转换时,您可以使用转换动画,因为它与uitabbarcoontroller一起使用。这种方法让我将uinavigationcontroller嵌入loginviewcontroller本身并始终以root身份进行。如果用户已登录,则在navigationController的viewcontrollers属性中添加containerview作为第二个元素,这将在顶部显示容器。注销时只需弹出到根视图控制器。此方法还可以帮助您在将来添加或删除选项卡和控制器,而无需触及故事板。我喜欢并想要一些编码示例请让我知道我也想发布代码。