我做了什么?
我使用Xcode 9模板在Swift中创建了一个支持Core Data的通用Master-Detail应用程序。
我想要什么?
我想在详细信息的导航栏中添加一个搜索栏。
我是怎么做到的?
let searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController
会发生什么? (实际问题)
搜索栏未显示在详细信息的导航栏中。相反,导航栏丢失了它的阴影线,当我回到主控时,导航会在导航中显示动画时间,然后消失。
仅当我在iPhone上运行代码时才会出现此问题,而不是在iPad(或横向模式下的iPhone)上运行代码,其中分割视图左侧是主视图,右侧是详细视图。
对我而言导航栏看起来有问题,但我无法理解它。
您可以在Github上下载示例项目here。
答案 0 :(得分:1)
我已经将它从表视图项中分离到了segue(kind = Show Detail(例如Replace))到{NavigationController-DetailViewController}。该segue的工作是在拆分视图中替换详细视图控制器,或者以紧凑模式推动细节视图控制器。
例如,如果显示详细信息(例如替换)segue,并将表格视图单元格直接连接到DetailViewController,使用“显示(例如推送)”segue类型,UISearchBar将按预期显示。 / p>
对于这种情况,看起来segue正在以影响搜索栏内搜索控制器的方式呈现视图控制器。设备之间的代码路径不同,这可以解释它在iPad上运行的原因。
Apple的开发者技术支持部门已确认这是iOS中的一个错误。
一个便宜的解决方法是使用自定义segue手动执行自适应演示(推或替换):
class PushOrPresentSegue: UIStoryboardSegue
{
override func perform() {
let splitVC = self.source.splitViewController
let destVC = self.destination
let nav = destVC as! UINavigationController
let topVC = nav.topViewController
if (splitVC?.traitCollection.horizontalSizeClass == .regular) {
// Replace
let splitViewControllerVCs = splitVC?.viewControllers
splitVC?.viewControllers = [splitViewControllerVCs![0], destVC];
}
else
{
// Push
let sourceVC = self.source
sourceVC.navigationController?.pushViewController(topVC!, animated: true)
}
}
}
在Storyboard中,必须将Master View Controller的单元格更改为Detail ViewContorller的导航控制器:Kind = Custom
,Class = PushOrPresentSegue