2012-03-16 39 views
3

我有一些對象鏈接在一個圓圈。每個對象擁有它的鄰國參考,方形和三角形是不同類類型:如何切換ViewController而不是添加到堆棧?

Each object holds a reference to it's neighbors, square and triangle are different class types

的拖班,三角形,正方形,由可見用視圖控制器,並鏈接到彼此塞格斯。

到目前爲止,沒有問題。然而,當我在我的結構中瀏覽時,我不斷添加ViewControllers在彼此之上。這不僅在內存方面看起來不太好,而且還會出現問題,當我想要退出這個結構時,我必須關閉所有打開的ViewController來關閉它。

所以我在找的是一種不在堆棧中的當前on上添加下一個ViewController,而是用下一個ViewController替換當前ViewController的方法。

我一直在尋找一個解決方案,但沒有成功。所以我覺得做我想做的事情要麼是不可能的,要麼我只是沒有明顯的觀點,不知道要尋找什麼。我需要一個RootViewController來處理這樣的事情嗎?或者我應該創建一個自定義的segue,在添加新的ViewController之前解除舊的ViewController?我真的很茫然。

回答

1

由於您可能正在使用導航控制器,因此應該查看UINavigationController引用。有一些方法可以修改導航堆棧。只有故事板才能做到這一點。您將需要一些自定義代碼。

+0

我目前沒有使用NavigationController,但我想如果需要的話我可以。 – 2012-03-16 12:55:43

+0

是的,使用導航控制器。如果你喜歡,navbar可以隱藏。一個開關只是一個流行音樂,然後是一個推動。可能最適合或者)彈出不帶動畫,然後用動畫推動或者2)彈出動畫和推動而不帶動畫;取決於你要去哪個方向。或者從不使用動畫。 – ader 2012-03-16 16:42:25

2

添加所有子視圖一次,在viewDidLoad中,並給所有你的SubView標籤,然後你想在viewController中顯示該視圖,不要添加它,只需通過調用函數將其放在前面[[self.view viewWithTag :1] bringToFront]

+0

當程序擴展時,這不是非常低效的內存嗎? – 2012-03-16 12:56:25

+0

不,它不是一次又一次地添加子視圖,而只是在堆棧中改變位置。 – 2012-03-16 12:59:49

+0

但我不得不一次加載整個數據集到子視圖中。我希望現在可以避免這種情況。 – 2012-03-16 19:13:19

1

聽起來像是你想要做的幾件事情一個

  1. 更換你rootViewController
  2. 有一個rootViewController充當容器單個UIViewController並更改根據需要進行。在iOS 5中,您可以使用自定義UIViewController, but or you could use one which Apple provided. UINavigationController執行此操作,但除非您也使用它來瀏覽視圖控制器結構等樹,否則它可能不是最佳選擇。

您的最佳答案依賴於您的需要。

如果你的控制器沒有太多的狀態或不進出很多,如果你希望用戶經常和快速和/或你的控制器控制器之間交換,你可以使用選項1

被換需要重要的設置或者有很多狀態,那麼你可能需要一個NSArray而只需要使用presentViewController:animated:completion:來顯示需要的不同控制器。將您的控制器存儲在NSArray中可以輕鬆識別其鄰居。

1

UINavigation控制器的方法setViewControllers是一個選項。

另一個將彈出最rencent視圖控制器使用popViewControllerAnimated: 在某些情況下,popToRootViewControllerAnimated:將是最好的,甚至popToViewController:動畫:。 Hoever,我個人沒有使用popToViewController:animated:但那可能是我當時的錯。

是的,我認爲你需要一個根視圖控制器。我自己試圖在前一天交換根視圖控制器,但是失敗了。最後,它可能不是最優雅的解決方案,但更容易實現一些虛擬根視圖控制器,它不會在後臺顯示我的應用徽標(與默認圖像相同,但移動到負座標以匹配默認值啓動時的圖像,它位於導航欄和狀態欄後面)。它可能會顯示一些空白的黑色背景。最後,它很可能永遠不會被看到。