背景
在项目中的一个搜索页面,导航栏是 UISearchBar,搜索页和结果页都在当前 Controller 中显示。
操作流程
- 输入文字点击 Search 按钮,或点击页面中的搜索历史
- 展示搜索结果,UISearchBar 失去第一响应者
- 点击 UISearchBar 的 Cancel 按钮
- 弹出键盘
- 再次点击 UISearchBar 的 Cancel 按钮
- 调用 delegate 方法:
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
在这里,delegate 方法中需要 pop 页面,而在展示搜索结果后,也就是 UISearchBar 失去第一响应者后,需要点击两次才能调用方法,不符合需求。
原因
因为在此时,Cancel 按钮的 enabled 属性被设置为 NO,如果想保持可以点击,需要在搜索框失去焦点的地方设置其 enabled 为 YES。
解决办法
// 设置取消按钮为可用状态
UIButton *cancelBtn = [self.searchBar valueForKey:@"cancelButton"];
cancelBtn.enabled = YES;
将这两行代码放置 UISearchBar 失去第一响应者之后即可。