我扩展了苹果的Table Search with UISearchController demo,以支持Peek和Pop为例:
问题是当我开始搜索表格时,Peek和Pop不再工作了.它只是选择突出显示:
我做的更新是MaintableVIEwController是:
class MaintableVIEwController: BasetableVIEwController,UISearchbarDelegate,UISearchControllerDelegate,UISearchResultsUpdating { overrIDe func vIEwDIDLoad() { super.vIEwDIDLoad() ... if traitCollection.forcetouchCapability == .available { registerForPrevIEwing(with: self,sourceVIEw: tableVIEw) } }}extension MaintableVIEwController: UIVIEwControllerPrevIEwingDelegate { func prevIEwingContext(_ prevIEwingContext: UIVIEwControllerPrevIEwing,vIEwControllerForLocation location: CGPoint) -> UIVIEwController? { guard let indexPath = tableVIEw?.indexPathForRow(at: location),let cell = tableVIEw?.cellForRow(at: indexPath),let controller = storyboard?.instantiateVIEwController(withIDentifIEr: "DetailVIEwController") as? DetailVIEwController else { return nil } prevIEwingContext.sourceRect = cell.frame controller.product = products[0] return controller } func prevIEwingContext(_ prevIEwingContext: UIVIEwControllerPrevIEwing,commit vIEwControllerToCommit: UIVIEwController) { guard let controller = vIEwControllerToCommit as? DetailVIEwController else { return } controller.product = products[0] show(controller,sender: self) }}
搜索上下文控制器是否干扰窥探和流行(甚至可以是键盘)?我可以让它工作,当表最初的所有数据,但它不是一旦我开始使用搜索.我附上一个working sample here,如果你想运行它看到的问题.
解决方法 首先,在您的MaintableVIEwController.vIEwDIDLoad()中,您还需要注册您的resultstableController.tableVIEw,因为这是一个单独的视图,将会收到peek / pop信息:if traitCollection.forcetouchCapability == .available { prevIEwingContext = registerForPrevIEwing(with: self,sourceVIEw: tableVIEw) if let resultVC = searchController.searchResultsController as? ResultstableController { resultVC.registerForPrevIEwing(with: self,sourceVIEw: resultVC.tableVIEw) }}
当测试这个解决方案时,我注意到一个奇怪的问题,结果集中的第一行不可窥视,结果集中的空白行WERE可以窥视.所以,在prevIEwingContext(_:vIEwControllerForLocation :)中的第二个修复:
func prevIEwingContext(_ prevIEwingContext: UIVIEwControllerPrevIEwing,vIEwControllerForLocation location: CGPoint) -> UIVIEwController? { guard let tableVIEw = prevIEwingContext.sourceVIEw as? UItableVIEw,let indexPath = tableVIEw.indexPathForRow(at: location),
在您的原始代码中,它使用MaintableVIEwController上的tableVIEw属性,而不是作为交互的sourceVIEw的tableVIEw.
现在,当你正在搜索,当你不是这样的时候,这样做是有效的.但是,当您输入搜索,但尚未输入任何搜索文本时,UISearchController处于活动状态,但是UItableVIEw是MaintableVIEwController的UItableVIEw,您不能将视图注册为源视图两次.所以,我们还有更多的工作要做:
// local property to store the result from registerForPrevIEwing(with:sourceVIEw:)var prevIEwingContext: UIVIEwControllerPrevIEwing?func dIDPresentSearchController(_ searchController: UISearchController) { if let context = prevIEwingContext { unregisterForPrevIEwing(withContext: context) prevIEwingContext = searchController.registerForPrevIEwing(with: self,sourceVIEw: tableVIEw) }}func dIDdismissSearchController(_ searchController: UISearchController) { if let context = prevIEwingContext { searchController.unregisterForPrevIEwing(withContext: context) prevIEwingContext = registerForPrevIEwing(with: self,sourceVIEw: tableVIEw) }}
基本上,当UISearchController出现时,我们取消注册MaintableVIEwController并注册搜索控制器.当被驳回时,我们做相反的事情.
随着这些变化,偷窥和流行在三个州的工作.
总结以上是内存溢出为你收集整理的UISableView单元上的ios – Peek和Pop在UISearchController中失败全部内容,希望文章能够帮你解决UISableView单元上的ios – Peek和Pop在UISearchController中失败所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)