UISearchController如何工作?

fum*_*007 6 cocoa-touch uikit ios ios8 uisearchcontroller

它怎么UISearchController做呢?

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

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

mal*_*hal 1

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

类似地,在UISearchBar的文本字段中开始编辑,它调用 的UISearchController,它_searchBarTextDidBeginEditing调用_performAutomaticPresentation使用转换协调器来为演示文稿设置动画。

在 中UISearchBar,didMoveToSuperView它[__searchController _searchBarSuperviewChanged]首先检查它的 searchBar 是否已放在 a 上UITableView,如果是,则配置其背景颜色、插图等以供查看。

是的,您可以自己构建这一切,但不是UISearchBar像在 Java 中那样通过子类化,而是使用 ObjC 的委托模式来代替继承,这会变得复杂,从而实现更扁平的类层次结构。例如,您有一个控制器类,它UISearchBar在其 init 方法中接受 a ,将自身设置为其委托,然后使用委托转发来允许现有委托方法仍然被外部公共委托调用。以下是除表视图之外的示例:

- (instancetype)initWithTableView:(UITableView *)tableView{
    self = [super init];
    if (self) {
        tableView.delegate = self;
        _tableView = tableView;
    }
    return self;
}

- (id)forwardingTargetForSelector:(SEL)aSelector{
    if(MHFProtocolHasInstanceMethod(@protocol(UITableViewDelegate), aSelector)){
        if([self.tableViewDelgate respondsToSelector:aSelector]){
            return self.tableViewDelgate;
        }
    }
    return [super forwardingTargetForSelector:aSelector];
}

-(void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    if([self.tableViewDelgate respondsToSelector:_cmd]){
        return [self.tableViewDelgate tableView:tableView didEndEditingRowAtIndexPath:indexPath];
    }
    [self performSelector:@selector(updateSelectionForCurrentVisibleDetailItem) withObject:nil afterDelay:0];
}
Run Code Online (Sandbox Code Playgroud)

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