ios - UISearchController 是如何工作的?

标签 ios cocoa-touch ios8 uikit uisearchcontroller

UISearchController 如何完成它所做的一切?

  • 它如何将 UISearchBar 转换为类似导航栏的 View ?
  • 它如何将 UISearchBar 放入另一个 View 层次结构并稍后恢复它?
  • 它是如何使用 UIViewController presentation API 完成这一切的?
  • 即使在所有呈现的 View Controller 都是全屏的 iPhone 上,它如何只覆盖呈现的 View Controller 的 View ?

我可以在不使用私有(private) API 的情况下制作自己的 UISearchController 吗?

最佳答案

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

同样,在 UISearchBar 的文本字段开始编辑时调用 UISearchController_searchBarTextDidBeginEditing 调用 _performAutomaticPresentation它使用过渡协调器为演示文稿设置动画。

UISearchBardidMoveToSuperView 中它调用 [__searchController _searchBarSuperviewChanged] 首先检查它的 searchBar 是否已经放在 UITableView 如果是这样,它会配置其背景颜色、插图等以供查看。

是的,您可以自己构建这一切,但不能像在 Java 中那样通过子类化 UISearchBar,而不是使用 ObjC 的委托(delegate)模式来实现更复杂的继承,从而实现更扁平的类层次结构。例如。您将有一个 Controller 类,它在其 init 方法中采用 UISearchBar,将自身设置为它的委托(delegate),然后使用委托(delegate)转发来允许现有的委托(delegate)方法仍然被外部公共(public)委托(delegate)调用。下面是一个除 TableView 之外的示例:

- (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];
}

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

关于ios - UISearchController 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29177185/

相关文章:

ios - 在 iOS 中后台上传照片超过 10 分钟

ios - Swift - 将数据从 TableView 传递到第三个 View Controller

ios - 在 iOS8 中通过通知在后台启动调用

iOS8:可以将 "tableview.rowHeight = UITableViewAutomaticDimension"用于静态单元格吗?

html - iOS 8 在 HTML 网络应用程序中嵌入 YouTube 失败

ios - 在不丢失约束的情况下调整 UITextView 的大小

ios - 如何在 iOS 中创建非圆角 UIProgressView

ios - 在 UITextField 的开头创建空间

iphone - UIImagePickerController 有时不会初始化相机 View

ios - 如何在 NSMutableArray 中使用循环在任何索引处获取对象