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 关注
- 897 浏览
添加回答
举报