2014-12-29 91 views
0

我正在研究一个应用程序,其中根视图控制器称为“ROOT”,呈现次视图控制器的视图,称为“A”,该视图嵌入一个导航控制器,称之为'NAV'。无法关闭导航控制器中嵌入的两个视图控制器

'ROOT'在其类实现中通过以下调用模态地呈现'A'。

self.presentViewController(A, animated: true, completion: nil) 

'A'视图中的按钮然后将'B'推到'NAV的视图控制器栈上。

在'B类实现中,当按下按钮时,我试图将用户发送回'ROOT'负责的视图。以下方法处理:

self.presentViewController(ROOT, animated: true, completion: nil) 

下面的电话都没有,尽管我相信他们应该考虑到“A”是由“根”模态呈现:

self.navigationController?.presentingViewController.dismissViewControllerAnimated(true, completion: nil) 
self.navigationController?.dismissViewControllerAnimated(true, completion: nil) 

然而,我发现,以下两个对象均为'无'

self.navigationController?.presentingViewController 
self.navigationController?.presentedViewController 

为什么没有工作的呼叫不起作用?这不是正确的方法吗?

是不是实际工作的方式基本上添加另一个视图和视图控制器在内存中跟踪?因此,如果我一遍又一遍地从“根”到“A”到“B”并回到“根”,它最终会使用太多的内存?

为什么最后列出的两个对象显示为零?

+0

你不应该提出A,你应该提出净资产值。 – rdelmar

回答

1

如果你想推一个ViewController它应该在NavigationController。将'A'设置为'NAV'的rootViewController。然后呈现'NAV'。

它最终会显示'A'。然后你可以推动流行ViewController的。

如果您使用的故事板试试这个:

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]; 

它只是一个想法,尝试以配合您的要求。:)

希望这会有所帮助.. :)

+0

这确实是'B'由'A'表示的。但是,我想将屏幕返回到'ROOT',它是呈现'A'的视图控制器。 'A'作为根视图控制器嵌入在导航控制器中。如果'A'(以及嵌入的导航控制器)以'ROOT'的形式呈现,那么我应该能够通过驳回'A'或'B'来恢复'ROOT'? – lane0335

+0

如果你在根目录下嵌入导航,是否有任何问题?然后推A和B? – Rashad

+0

可能不是。我只是想知道是否有办法做到这一点,而不是将其嵌入其中。如果你(或任何其他人)知道这样做的方式是非常重要的。否则,我认为这是它必须走的方向。 – lane0335

相关问题