iOS:将搜索栏添加到主详细信息应用程序中的导航栏

时间:2018-03-14 22:15:28

标签: ios swift uinavigationcontroller master-detail uisearchcontroller

我做了什么?

我使用Xcode 9模板在Swift中创建了一个支持Core Data的通用Master-Detail应用程序。

我想要什么?

我想在详细信息的导航栏中添加一个搜索栏。

我是怎么做到的?

let searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController

会发生什么? (实际问题)

搜索栏未显示在详细信息的导航栏中。相反,导航栏丢失了它的阴影线,当我回到主控时,导航会在导航中显示动画时间,然后消失。

enter image description here

仅当我在iPhone上运行代码时才会出现此问题,而不是在iPad(或横向模式下的iPhone)上运行代码,其中分割视图左侧是主视图,右侧是详细视图。

对我而言导航栏看起来有问题,但我无法理解它。

您可以在Github上下载示例项目here

1 个答案:

答案 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