2011-01-10 232 views
7

我使用的是UISplitViewController內的UITabBarController與拆分視圖的主窗格純UIViewController和在細節窗格,它本身含有香草UIViewController一個UINavigationControllerUISplitViewController委託方法不叫

我知道Apple建議僅​​在根級別使用拆分視圖,但是我已經看到其他應用程序(例如,亞馬遜 - 「願望清單」選項卡)在選項卡中使用拆分視圖,所以我相信這是可能的。

我的問題是,拆分視圖的委託方法,即。 UISplitViewControllerDelegate中的那些不會被調用,這會阻止我在切換到縱向模式時創建我的彈出式菜單。

有問題的方法有以下幾種 -

// Called when a button should be added to a toolbar for a hidden view controller 
- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc; 

// Called when the view is shown again in the split view, invalidating the button and popover controller 
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem; 

// Called when the view controller is shown in a popover so the delegate can take action like hiding other popovers. 
- (void)splitViewController: (UISplitViewController*)svc popoverController: (UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController; 

UISplitViewController確實收到旋轉通知。

我能到被稱爲willShowViewController方法,如果我強迫狀態欄取向在應用程序啓動之初景觀右(或左),使用

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 

然而,willHideViewController沒有按不會打電話。我不想強制應用程序開始景觀。如果我做同樣的事情,但強迫它肖像,我沒有收到回調。

我不明白爲什麼分割視圖控制器沒有調用它的委託方法,否則它的行爲是正確的。這些方法應該從它的方法 - 被稱爲

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

內部,當我斷點在這裏面,我可以檢查委託設置,它仍然活着。

一直呆在這一整天!其他一切都很好,我很高興splitview/tabbar/navbar組合運行良好。我只需要這些通知。

我應該在旋轉時手動調用它們嗎?當'UISplitViewController'應該這樣做時,似乎非常錯誤。

回答

4

解決了,它必須位於根級或tabBar的直接子視圖,該視圖條也必須位於根級別。煩!

+0

你好, 你介意一點點進一步闡述您的解決方案? 我現在有同樣的問題。我有一個tabcontroller至少有3個選項卡的分割視圖。我將每個splitview中的detailview添加到一個代表splitview的自己的子類導航控制器中。這對於目前可見的選項卡來說是完美的,但對於其他選項則不是。所以當我旋轉我的視圖,並更改選項卡它看起來都搞砸了,直到我旋轉它。再次,然後只爲可見的看法。 – 2011-02-09 17:07:01

+0

嗯抱歉,我不確定..我敢肯定我在這裏看過一篇文章,指出在splitview選項卡和旋轉之間更改會導致問題,並且splitviwe應始終處於窗口級別 - 甚至不會在標籤控制器。我猜想這是由文檔支持的。我實際上是從零開始構建自己的SplitView,因爲我需要水平分割 – Sam 2011-02-09 22:29:37

3

首先,試着看看你是否設置了正確的代表。 例如,假設你創建了三個控制器,

UISplitViewController* splitView; 
UIViewController* masterView; 
UIViewController* detailView; 

您實現了委託協議的詳細視圖,這樣,當方向的變化,詳細視圖應該能夠把一個按鈕在工具欄中。

現在爲了使splitView從代理調用此函數,您需要設置委託本身。

所以某個地方,如果你錯過下面的調用,

splitView.delegate = detailView; 

的DetailView的將永遠不會得到通知的方向變化等。至少這是我被卡住了。

另一種選擇是查看下面的鏈接。它也有一個完整的工作代碼,雖然經過一番審查後,它可能比你需要的東西有點多,但是嘿,這是一個已經工作的代碼,所以應該讓你快點。

http://www.noorselijster19.com/2011/03/ios/combine-tabbar-and-splitview/

2

我喜歡從主UIViewController中對細節的UIViewController發送消息的以下方法。某處主人的裏面執行:

id detailViewController = [[self.splitViewController viewControllers] lastObject]; 
[detailViewController setSomeProperty:…]; 

這是保羅·赫加蒂的2011年秋季斯坦福iTunesU iPad和iPhone應用程序開發過程。