UISearchController.searchResultsController?视图的区别.isHidden和ui



我目前正在使用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,您的代码应该可以继续正常运行。直接深入搜索控制器视图的内部可能会导致不正确的行为或糟糕的用户界面。

最新更新