我的项目是基于故事板的,包括以下控制器:
TableViewController
,其中包含项目列表。ViewController
,显示TableViewController
中所选项目的详细信息。 UISearchController
内TableViewController
,其searchBar
设置为tableHeaderView
的{{1}}。 tableView
的要点在这里:
TableViewController
我已在界面构建器中检查了class TableViewController: UITableViewController {
private let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
}
}
Adjust Scroll View Insets
<{1}}。
TableViewController
。{/ 1}
当用户点击列表中的某个项目时,它会转到ViewController
并提供有关该项目的详细信息。
在大多数情况下,一切都运作顺畅,TableViewController
按预期显示:
当用户更改ViewController
中的方向然后再回到TableViewController
时,会出现此问题。在这种情况下,后者为其表格&#39;:
如果在点击项目之前取消搜索,则问题不存在。
在iOS 9模拟器上记录问题:https://vimeo.com/182953863。
为了确保表格视图的内容插入有问题,我在viewDidLayoutSubviews
TableViewController
方法中打印了插页。这是输出:
// Normal mode
UIEdgeInsets(top: 64.0, left: 0.0, bottom: 0.0, right: 0.0)
// After orientation changes in ViewController
UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)
在SO(1,2,3)上提出了许多类似的问题,我从中得出了两个结论:
autoAdjustScrollViewInsets
并在代码中手动设置insets。这个应该肯定有用,但我想首先找到问题的罪魁祸首。我试图做的事情:
hidesNavigationBarDuringPresentation
设为true
。问题依然存在。definesPresentationContext
设置为false
,并在self.view.endEditing(true)
prepareForSegue
中调用TableViewController
(此效果无效)。问题消失了。但是搜索栏在视图控制器的层次结构中保持不变,即ViewController
,这是不可接受的。prepareForSegue
之前searchController.searchBar.resignFirstResponder()
的搜索栏中的第一响应者辞职。问题依然存在。我已经组装了一个test project来重现这个问题。搜索不起作用,列表项是硬编码的,但它确实重现了这个问题而没有额外的细节。
我设置搜索控制器的方式一定有错误,但我找不到它。