我已将其隔离到从表视图项到 {NavigationController-DetailViewController} 的 segue(种类 = Show Detail(例如 Replace)。该 segue 的工作是替换拆分视图中的详细视图控制器,或者以紧凑模式推送详细视图控制器。
例如,如果撕掉 Show Detail (e.g. Replace) segue,并将表格视图单元格直接连接到 DetailViewController,使用“Show (e.g. Push)” segue 类型,UISearchBar 将按预期显示。
对于这种情况,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 的 Navigation Controller 之间的 segue 更改为:Kind = Custom, Class = PushOrPresentSegue