3 回答

TA貢獻1874條經驗 獲得超12個贊
哦,老兄,這讓我頭疼了好幾天,無法弄清楚該怎么做。最糟糕的是,使用master-detail模板創建一個新的Xcode iOS項目效果很好。幸運的是,最后,幾乎沒有什么是我找到解決方案的方法。
我發現有一些帖子建議解決方案是在上實現新primaryViewControllerForCollapsingSplitViewController:方法UISplitViewControllerDelegate。我嘗試了一下都無濟于事。Apple在似乎有效的主從模板中所做的工作是實現新的(深呼吸地說所有這一切)splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:委托方法(再次UISplitViewControllerDelegate)。根據docs,此方法:
請委托人調整主視圖控制器,并將輔助視圖控制器合并到折疊的界面中。
確保閱讀該方法的討論部分以獲取更多具體細節。
Apple處理此問題的方式是:
- (BOOL)splitViewController:(UISplitViewController *)splitViewController
collapseSecondaryViewController:(UIViewController *)secondaryViewController
ontoPrimaryViewController:(UIViewController *)primaryViewController {
if ([secondaryViewController isKindOfClass:[UINavigationController class]]
&& [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]]
&& ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) {
// Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return YES;
} else {
return NO;
}
}
此實現基本上執行以下操作:
如果secondaryViewController是我們期望的(a UINavigationController),并且正在顯示我們期望的(a- DetailViewController您的視圖控制器),但沒有模型(detailItem),則Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.“
否則,返回“ NO讓拆分視圖控制器嘗試將輔助視圖控制器的內容合并到折疊的界面中”
對于縱向模式的iPhone(以縱向模式開始或旋轉為縱向模式或更精確的緊湊尺寸級別),結果如下:
如果你的觀點是正確的
并有一個模型,顯示細節視圖控制器
但沒有模型,請顯示主視圖控制器
如果你的觀點不正確
顯示主視圖控制器
清澈如泥。

TA貢獻1966條經驗 獲得超4個贊
這是Swift中公認的答案。只需創建此子類并將其分配到情節提要中的splitViewController。
//GlobalSplitViewController.swift
import UIKit
class GlobalSplitViewController: UISplitViewController, UISplitViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController!, ontoPrimaryViewController primaryViewController: UIViewController!) -> Bool{
return true
}
}

TA貢獻1805條經驗 獲得超10個贊
迅捷版Mark S的正確答案
如Apple的主從模板所提供。
func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController, ontoPrimaryViewController primaryViewController:UIViewController) -> Bool {
guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false }
guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false }
if topAsDetailController.detailItem == nil {
// Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return true
}
return false
}
澄清度
(Mark S所說的有點令人困惑)
該委托方法稱為splitViewController: collapseSecondaryViewController: ontoPrimaryViewController:,因為它就是這樣做的。當更改為更緊湊的寬度尺寸時(例如,將手機從橫向旋轉到縱向時),它需要將拆分視圖控制器僅折疊為其中一個。
此函數返回一個布爾值,以決定是否應折疊Detail并顯示Master。
因此,在本例中,我們將根據是否選擇了詳細信息來決定。我們如何知道是否選擇了我們的詳細信息?如果我們遵循Apple的Master-Detail模板,則詳細視圖控制器應具有一個包含詳細信息的可選變量,因此如果它為nil(.None),則沒有任何選擇,我們應該顯示Master,以便用戶可以選擇某些內容。
而已。
- 3 回答
- 0 關注
- 927 瀏覽
添加回答
舉報