UISearchBar 和 UISearchBarController 之间的区别?

Difference between UISearchBar and UISearchBarController?

我对 UISearchBar/UISearchBarDelegateUISearchBarController 之间的区别感到困惑。

现在,这就是我正在做的来实现我的搜索栏:

class SearchViewController: UIViewController {
    @IBOutlet weak var searchBar: UISearchBar!
}

extension SearchViewController: UISearchBarDelegate {

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        searchBar.resignFirstResponder()
        if !searchBar.text!.isEmpty {
            performSegue(withIdentifier: "Search", sender: searchBar.text!)
        }
    }
}

我在网上看到有人在做这样的事情:

let searchController = UISearchController(searchResultsController: nil)

这和我现在做的有什么区别?

大致。

  • UIxxx 是在屏幕上呈现的对象的 class,(UIButton,等等)

  • UIxxxController是对象的class,协调屏幕上的对象(接收事件等)

  • UIxxxDelegate class 嵌入功能代码的对象,让 UIxxx 对象按照您想要的方式运行(填充内容等)。

您的代码看起来像是通过 IB 连接的。在互联网上找到的代码看起来控制器是直接在代码中构建的,而不是通过 IB; UISearchController 已实例化。

你的问题有点类似于问 "What is the difference between UIView and UIViewController?"

UISearchBar 是一个 视图 。它有一个文本字段和(可选)一个按钮,仅此而已。

UISearchController 是一个 控制器 ,它控制着 "searching" 更抽象的行为。它的工作之一是控制其 searchBar 的行为,但它还有许多其他工作,例如告诉 searchResultsUpdater 它应该更新搜索结果(因为搜索栏中的文本有改变,或其他)。它还公开了 obscuresBackgroundDuringPresentationhidesNavigationBarDuringPresentation 等属性,以控制当搜索栏是第一响应者时视图的外观。

如果您直接使用 UISearchBar,那么您需要手动实现 UISearchController 为您做的所有这些事情。如果您打算创建 UISearchController 不提供的您自己的搜索行为类型,则可能需要这样做,但如果您只想在您的应用程序中使用普通的旧搜索功能,请使用 UISearchController,因为它将为您节省很多时间。