2012-10-17 62 views
0

我創建了一個基於「Single View Application」Xcode模板的應用程序。它有一個導航控制器和一個rootViewController。iOS - 導航控制器中的奇怪

當我在RootViewController的,我做

[self presentModalViewController:nextModalViewController animated:YES]; 

新的視圖控制器在動畫。

我的問題是這樣的。我已經在序列呈現很多viewControllers的,即

A > B > C > D 

,或者換句話說,我已經從B中B,從A,使用presentModalViewController,C等之一。是的,我必須使用presentModalViewController,因爲我有一個特殊的動畫在viewControllers之間轉換,我不能使用[self.navigationController push ...

我的問題是:當我使用presentModalViewController關於導航堆棧時會發生什麼?控制器是否被推送到某個堆棧?有沒有一種方法可以獲得給定時間所有導航控制器的引用?像那個導航堆棧的東西?我的意思是,假設我在D上,並且想要得到D之前出現的所有控制器的列表。

我知道我可以創建屬性並將其傳遞。我只是想知道如果這些東西已經建立在iOS上,那麼。

謝謝。

+0

什麼是奇怪? – 2012-10-17 14:54:59

+0

需要注意的一點是,presentModalViewController是所有UIViewControllers上的一個方法(並且在ios6中已棄用!)。如果您只調用presentModalViewController,並且從不使用像pushViewController這樣的UINavigationController特定的調用,那麼您應該考慮重構。在這個重構中,我建議將UINavigationController更改爲標準的UIViewController,並使用presentViewController:animated:completion:方法。 – 2012-10-17 18:56:59

回答

1

在iOS 5及更高版本中,UIViewController有一個presentingViewController屬性,該屬性返回呈現接收者的視圖控制器。在iOS 4及更早版本中,使用呈現的視圖控制器的parentViewController屬性來訪問其呈現視圖控制器。因此,您可以通過適當地訪問這些屬性來訪問D的C視圖控制器。 See the docs for further information.

如果您要訪問的所有視圖控制器在一條鏈,你可以這樣做:

UIViewController *node = self; 
while (node != nil) { 
    // do something with the view controller, then skip to its parent 
    node = node.presentingViewController; 
    // or node = node.parentViewController; in iOS 4 or older 
} 
+0

P E R F E C T !!!!!!!!!!!!!!!我忘記了! – SpaceDog

+0

@RubberDuck謝謝:)我很高興得到了幫助。 – 2012-10-17 15:13:28

-1

每一個模態演示後,我會隨後檢查從你的UINavigationController的viewControllers屬性的大小,並檢查它是否增長。

UIViewController *theControllerYouWant = [self.navigationController.viewControllers objectAtIndex:(theIndexOfYourViewController)]; 
+1

沒有。該屬性只顯示rootViewController,不增長。 – SpaceDog