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
它使用过渡协调器为演示文稿设置动画。
在 UISearchBar
的 didMoveToSuperView
中它调用 [__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/