我正在开发一个应用程序,其中根视图控制器,称为“ROOT”,呈现一个辅助视图控制器的视图,称之为“A”,它嵌入在导航控制器中,称之为“NAV”。 / p>
'ROOT'在其类实现中通过以下调用以模态方式呈现'A'。
self.presentViewController(A, animated: true, completion: nil)
'A'视图中的按钮然后将'B'推到'NAV的视图控制器堆栈上。
在'B'类实现中,当按下按钮时,我试图将用户发送回'ROOT'负责的视图。以下方法有效:
self.presentViewController(ROOT, animated: true, completion: nil)
以下的电话没有,即使我认为他们应该给'A'以'ROOT'模式呈现:
self.navigationController?.presentingViewController.dismissViewControllerAnimated(true, completion: nil)
self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
但是,我发现以下两个对象都是'nil'
self.navigationController?.presentingViewController
self.navigationController?.presentedViewController
为什么无效的通话不起作用?这不是正确的方法吗?
实际工作的方式是不是基本上在内存中添加另一个视图和视图控制器来跟踪?因此,如果我从'Root'变为'A'再到'B'并一遍又一遍地回到'Root',它最终会占用太多内存?
为什么最后列出的两个对象显示为nil?
答案 0 :(得分:1)
如果您想推送ViewController
,则应该在NavigationController
之内。设置' A'作为NAV'的rootViewController
。然后出现NAV'
它最终会显示出' A'。然后你可以推送pop ViewController
&#39>。
如果您正在使用故事板,请尝试以下方法:
let B = self.storyboard.instantiateViewControllerWithIdentifier ("B") as B
self.navigationController.pushViewController(B, animated: true)
修改强>
如果您想在某些视图之间导航,最好将所有这些视图放在一个导航控制器中。或者你可以这样做:
首先将NAV(' ROOT'作为其rootViewController)设置为窗口的rootViewController。如果ROOT是登录屏幕,当用户登录成功时设置' A'作为其rootViewController。如果我考虑回到ROOT意味着您正在注销,那么只需将您的NAV的rootViewController更改为ROOT。我有一个Objective-C示例:
在我的AppDelegate中:
LoginView *myAcc = [[LoginView alloc] initWithNibName:@"LoginView" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController : myAcc];
self.window.rootViewController = navController;
用户成功登录时:
AccountMenu *accMenu = [[AccountMenu alloc] initWithNibName:@"AccountMenu" bundle:nil];
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];
[viewControllers removeLastObject];
[viewControllers addObject:accMenu];
[[self navigationController] setViewControllers:viewControllers animated:YES];
这只是我分享的一个想法,尝试与您的要求相匹配。 :)
希望这会有所帮助.. :)