我目前正在使用UISearchController
,我发现UISearchController
的一些尴尬行为。
以前我不知道有showsSearchResultsController
属性可以帮助我隐藏searchResultsController
。所以我试图通过使用searchResultsController?.view.isHidden
来管理它。但是我发现,在少数情况下,我将true
分配给searchResultsController?.view.isHidden
,视图不会被隐藏。
然而,当我使用showsSearchResultsController
并将false
赋值给它时,searchResultsController
就像我想要的那样起作用了。
第一个代码是我最初使用的代码(故障)。
第二段代码是我修复的代码(运行正常)。
isHidden
.asDriver(onErrorJustReturn: true)
.drive(onNext: { [weak self] in
print("isHidden Before ($0) (self?.searchController.searchResultsController?.view.isHidden)")
self?.appSearchController.searchResultsController?.view.isHidden = $0
print("isHidden After ($0) (self?.searchController.searchResultsController?.view.isHidden)")
})
.disposed(by: disposeBag)
isHidden
.asDriver(onErrorJustReturn: true)
.drive(onNext: { [weak self] in
print("isHidden Before ($0) (self?.searchController.searchResultsController?.view.isHidden)")
self?.appSearchController.showsSearchResultsController = !$0
print("isHidden After ($0) (self?.searchController.searchResultsController?.view.isHidden)")
})
.disposed(by: disposeBag)
在这两个例子中,print的输出都是
isHidden Before false Optional(false)
isHidden After false Optional(true)
通过使用showsSearchResultsController
,我已经解决了这个问题,但我真的想知道两者之间的区别。在我看来,我认为两个代码看起来很相似。分享想法对我很有帮助。
使用showsSearchResultsController
属性是更好的方法。它是UISearchController
提供的公共API的一部分。设置该属性允许搜索控制器执行它认为合适的任何操作来显示/隐藏搜索结果。这可能不仅仅是简单地显示/隐藏视图。
当您执行类似searchResultsController?.view.isHidden = someBool
的操作时,您正在挖掘搜索控制器的(可争议的)私有子结构。您正在绕过公共API。您可能会失去使用showsSearchResultsController
提供的公共API所获得的一些细微差别或技巧。
iOS的未来版本可能会改变UISearchController
和搜索结果视图的外观和感觉。通过使用公共API,您的代码应该可以继续正常运行。直接深入搜索控制器视图的内部可能会导致不正确的行为或糟糕的用户界面。