2010-05-04 47 views
6

我試圖在UISplitViewController中更改主視圖控制器(出現在肖像中的彈出窗口中,以及在橫向上的左側)。我想在主視圖控制器之間切換兩個不同的UIViewControllers之一(取決於在我的應用程序中採取的其他操作)。UISplitViewController無法更改主視圖控制器?

我使用以下:

mySplitViewController.viewControllers = [NSArray的arrayWithObjects:newMasterController,detailController,零]。

這正確地更改了主視圖控制器,就像在橫向模式下所期望的那樣。然而,而不是似乎更改用於縱向模式中的彈出窗口的視圖控制器。

我注意到barbuttonitem顯示這個主視圖控制器只是調用showMasterInPopover:在splitviewcontroller上,所以也期望它也可以在縱向模式下工作,但事實並非如此。

其實,我可以設置主視圖控制器,看到正確的viewController在橫向模式下,轉動肖像,並在酥料餅使用的視圖 - 控制是仍然舊的。

這是一個錯誤?

回答

1

更新:請在底部閱讀最終更新! Oiginal answer +以下更新可能沒有用處!

我們剛剛有完全相同的問題。有時我想知道Apple是否真的用類似於實際用例的方式測試他們編寫的類,因爲UISplitViewController不是他們最好的時刻。

問題是,當您在拆分視圖中替換主視圖控制器時,UISplitViewController中的代碼不會更新其彈出窗口控制器的contentViewController屬性。結果是彈出窗口控制器在過時的視圖控制器上仍然有一個句柄,導致在縱向模式下出現舊UI,甚至出現內存錯誤。

這是我們的解決方法。

我將假設你有一個UISplitViewControllerDelegate符合類,它將popoverController存儲爲一個類屬性(請參閱UISplitViewController的標準示例代碼)。

在爲你設置了新的主視圖控制器的地步,你還需要更新contentViewController,如下所示:

mySplitViewController.viewControllers 
    = [NSArray arrayWithObjects:newMasterController, detailController, nil]; 

// in the cases where the uisplitview has already shown a popovercontroller, 
// we force the popovercontroller to update its content view controller. 
// This ensures any old content view in popover actually gets released by 
// the popovercontroller. 
if (popoverController) { 
    [popoverController setContentViewController:theMasterViewController 
           animated:NO];  
} 

您還必須設置酥料餅的contentViewController當你UISplitViewControllerDelegate被告知,酥料餅控制器會呈現一個視圖控制器:

- (void)splitViewController:(UISplitViewController*)svc 
     popoverController:(UIPopoverController*)pc 
     willPresentViewController:(UIViewController *)aViewController 
{ 
    // set the popoverController property - as per Apple's sample code 
    self.popoverController = pc; 

    // THE LINE BELOW IS THE NEW LINE! 
    [popoverController setContentViewController:aViewController animated:NO]; 

是的,我知道上面的代碼看起來瘋了,你想知道爲什麼蘋果不能只是設置的內容視圖控制器本身。但他們顯然不這樣做,這是修復。

UPDATE

上述方案,與設置內容看,原來不要畢竟工作。例如,如果您將內容視圖設置爲uinavigationcontroller,稍後您將通過導航控制器內的根視圖,而不是導航控制器本身。就我所見,UISplitViewController只是不能以任何可行的方式處理更改主視圖。

我目前的解決方法是安裝一個UINavigationController作爲主視圖,並更改該導航控制器的根視圖控制器。所以我以某種方式改變了「後門」主視圖。

更新2

我放棄了。上面第一次更新中的方法也是有缺陷的;我仍然在旋轉時遇到問題。基本上,如果你使用UISplitViewController,你不應該試圖改變主視圖控制器(即使你在主視圖,例如作爲彈出窗口的情況下切換主視圖,已經被再次隱藏)。在主視圖中調用UINavigationController的內容(,而主視圖顯示爲)看起來好像可以,但除此之外的任何內容都會導致問題出現問題。

技術說明:我認爲這些問題源自Apple在處理UI方面的明顯弱點:即Apple代碼將在UIViews和控制器上調用釋放,一旦隱藏或從視圖中移除,但稍後如果包含viewcontroller再次顯示,發送推遲的消息,如viewDidDisappear到已發佈的視圖/控制器(在此時可能已被釋放)。

+0

UISplitViewController存在大量的缺陷。這看起來是最糟糕的。 iOS SDK 5.1仍然存在這些問題。但是,似乎在此版本中使用UINavigationController作爲根主視圖的解決方法可以正常工作。 – 2012-05-10 15:24:57

+0

哇,還是那麼糟糕,這個遲到了嗎?感謝您更新我們Dan。 – occulus 2012-05-10 15:30:01

2

如果有人正在尋找這個問題的解決方案(或一個字左右),我也有類似的問題,在這裏工作了:Changing the master view in Split View does not update the popover in portrait

基本上,我用的主視圖導航控制器控制器以及該導航控制器內的推/俯視圖控制器,以在彈出視圖中更改主視圖中的視圖控制器,同時仍以縱向方式顯示正確的視圖控制器。

相關問題