2014-12-29 130 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

相關問題