3 回答

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個贊
哦,老兄,這讓我頭疼了好幾天,無法弄清楚該怎么做。最糟糕的是,使用master-detail模板創(chuàng)建一個新的Xcode iOS項(xiàng)目效果很好。幸運(yùn)的是,最后,幾乎沒有什么是我找到解決方案的方法。
我發(fā)現(xiàn)有一些帖子建議解決方案是在上實(shí)現(xiàn)新primaryViewControllerForCollapsingSplitViewController:方法UISplitViewControllerDelegate。我嘗試了一下都無濟(jì)于事。Apple在似乎有效的主從模板中所做的工作是實(shí)現(xiàn)新的(深呼吸地說所有這一切)splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:委托方法(再次UISplitViewControllerDelegate)。根據(jù)docs,此方法:
請委托人調(diào)整主視圖控制器,并將輔助視圖控制器合并到折疊的界面中。
確保閱讀該方法的討論部分以獲取更多具體細(xì)節(jié)。
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;
}
}
此實(shí)現(xiàn)基本上執(zhí)行以下操作:
如果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讓拆分視圖控制器嘗試將輔助視圖控制器的內(nèi)容合并到折疊的界面中”
對于縱向模式的iPhone(以縱向模式開始或旋轉(zhuǎn)為縱向模式或更精確的緊湊尺寸級別),結(jié)果如下:
如果你的觀點(diǎn)是正確的
并有一個模型,顯示細(xì)節(jié)視圖控制器
但沒有模型,請顯示主視圖控制器
如果你的觀點(diǎn)不正確
顯示主視圖控制器
清澈如泥。

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個贊
這是Swift中公認(rèn)的答案。只需創(chuàng)建此子類并將其分配到情節(jié)提要中的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貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超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所說的有點(diǎn)令人困惑)
該委托方法稱為splitViewController: collapseSecondaryViewController: ontoPrimaryViewController:,因?yàn)樗褪沁@樣做的。當(dāng)更改為更緊湊的寬度尺寸時(例如,將手機(jī)從橫向旋轉(zhuǎn)到縱向時),它需要將拆分視圖控制器僅折疊為其中一個。
此函數(shù)返回一個布爾值,以決定是否應(yīng)折疊Detail并顯示Master。
因此,在本例中,我們將根據(jù)是否選擇了詳細(xì)信息來決定。我們?nèi)绾沃朗欠襁x擇了我們的詳細(xì)信息?如果我們遵循Apple的Master-Detail模板,則詳細(xì)視圖控制器應(yīng)具有一個包含詳細(xì)信息的可選變量,因此如果它為nil(.None),則沒有任何選擇,我們應(yīng)該顯示Master,以便用戶可以選擇某些內(nèi)容。
而已。
- 3 回答
- 0 關(guān)注
- 922 瀏覽
添加回答
舉報