UISearchBar取消按钮无响应

8
我已经实现了搜索栏,一旦用户在搜索栏中获得焦点,就会显示取消按钮。为此,我在我的searchBarTextDidBeginEditing方法中编写了searchBar.showsCancelButton = YES;。在searchBarSearchButtonClicked中,我放弃键盘,以便用户可以查看完整的表格视图。
问题:此时搜索栏取消按钮没有响应。只有当搜索栏再次获得焦点时,它才会响应。这是搜索栏取消按钮的默认属性吗?还是我的代码有缺陷?我想在不再将焦点放回搜索栏的情况下使用取消按钮。

1
如何在搜索栏的文本字段上取消第一响应者(responder)? - Ilker Baltaci
你检查过我的答案了吗? - Rajneesh071
这是真的...无论是设计还是不经意,只要它存在,它就应该能够工作。 - Morkrom
4个回答

4

是的,你可以使你的UISearchBar取消按钮响应。 默认情况下,它是不可用的,但你可以访问它的子视图,然后将取消按钮设置为可用。

for (id object in [mySearchBar subviews])
{
    if ([object isKindOfClass:[UIButton class]])
    {
        UIButton *searchBarCancelBtn = (UIButton*)object;
        [searchBarCancelBtn setEnabled:YES];
    }
}

如果您需要其他逻辑,请按照以下答案进行操作:在UISearchBar文本字段中自定义清除按钮


4
这是搜索栏取消按钮的默认行为。如果您想要其他功能,只需取消搜索栏的cancelbutton属性,并可以使用UIButton作为取消按钮。

1
谢谢!我会尝试实现自己的取消按钮。 - JiteshW

3
我认为当UISearchBar获得焦点时,默认行为就是启用取消按钮。当UISearchBar失去焦点时,您无法获取取消按钮事件。

因此,我建议您执行以下任务:

  • 创建一个工具栏
  • 插入具有自定义视图的UISearchBar作为UIBarButtonItem
  • 插入名为“取消”的UIBarButtonItem并带有操作

0
上述方法已经失效,这是在iOS 17.0上经过测试并且可行的方法。
- (void)enableCancelOnSearchBar
{
    [self enableButtonsForView:self.searchBar];
}

- (void)enableButtonsForView:(UIView*)view {
    NSArray<UIView*>* subviews = [view subviews];
    [subviews fbl_forEach:^(UIView * _Nonnull value) {
        if ([value isKindOfClass:[UIButton class]]) {
            [(UIButton*)value setEnabled:YES];
        } else {
            [self enableButtonsForView:value];
        }
    }];
}

fbl_forEachFBLFunctional[https://github.com/google/functional-objc]提供。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接