UISearchController如何工作?

时间:2015-03-20 23:11:01

标签: ios cocoa-touch ios8 uikit uisearchcontroller

UISearchController如何做它所做的一切?

  • 如何将UISearchBar转换为类似导航栏的视图?
  • 如何将UISearchBar放入另一个视图层次结构并稍后恢复?
  • 如何使用UIViewController演示文稿API完成所有这些?
  • 即使在所有呈现的视图控制器都是全屏的iPhone上,它如何仅覆盖呈现视图控制器的视图?

我可以在不使用私有API的情况下创建自己的UISearchController吗?

1 个答案:

答案 0 :(得分:1)

UISearchController创建一个UISearchBar,并在其内部_connectSearchBar方法中调用UISearchBar _setSearchController上的私有方法。然后在UISearchBar的内部事件方法中,例如_searchFieldBeginEditing首先调用其公共委托方法,然后调用[__searchController _searchBarTextDidBeginEditing:]以允许控制器也处理事件。这就是启用功能“您可以自由成为UISearchBar的代表”的原因。

类似地,在UISearchBar的文本字段中开始编辑,它调用UISearchController的{​​{1}},后者调用_searchBarTextDidBeginEditing,后者使用过渡协调器为演示文稿添加动画。

_performAutomaticPresentation的{​​{1}}中调用UISearchBar,它首先检查其searchBar是否已放在didMoveToSuperView上,如果是,它会配置其背景颜色,插图等等。

是的,您可以自己构建所有东西,但不能像在Java中那样通过继承[__searchController _searchBarSuperviewChanged]来继承它,而不是继承,继承可以使用ObjC的委托模式来实现,该委托模式可以使类层次结构更加扁平化。例如。您将拥有一个控制器类,该控制器类的init方法中使用UITableView,将其自身设置为其委托,然后使用委托转发来允许现有的委托方法仍然被外部公共委托调用。这是一个除了表格视图的示例:

UISearchBar

此模式的要点是不再需要调用控制器的子类来调用super,以确保一切仍按预期运行,而无需程序员调用super。由于它可以与任何类型的搜索栏一起使用,因此它还提供了更多可重用的类。