fum*_*007 6 cocoa-touch uikit ios ios8 uisearchcontroller
它怎么UISearchController做呢?
UISearchBar为类似导航栏的视图?UISearchBar放入另一个视图层次结构并在以后恢复?UIViewController表示API 完成所有这些的?我可以在UISearchController不使用私有API 的情况下自行创建吗?
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。此外,它还提供了更多可重用的类,因为它可以与任何类型的搜索栏一起使用。
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |