【问题标题】:Search Bar Cancel Button is Not Working搜索栏取消按钮不起作用
【发布时间】:2015-12-17 06:17:33
【问题描述】:

我的应用程序有一个搜索栏,用于从由 sqlite DB 填充的表视图中搜索记录。 我的问题是,当视图打开时,“取消”按钮未启用,我也无法触摸它,就像仅图像一样。它存在但没有任何操作。 当我们单击该搜索栏文本时,取消按钮将更改为“完成”,它已启用。 所以这是我的代码

这是我的搜索栏视图,请查看取消按钮。它未启用

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    //[newSearchBar setShowsCancelButton:YES animated:YES];


    newSearchBar.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;

    NSLog(@"search begin edit") ;

    //searchString = searchBar.text;

    //NSLog(@"print did edit searchstring : %@", searchString) ;

    for(UIView *view in [searchBar subviews])       
    {

        //shareItemId =newSearchBar.text;

        if([view isKindOfClass:[NSClassFromString(@"UINavigationButton") class]]) {
            [(UIBarItem *)view setTitle:@"Done"];

        }
        }

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    NSLog(@"searchBarTextDidEndEditing:");


    [searchBar resignFirstResponder];
    //[self dismissModalViewControllerAnimated:YES];
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    NSLog(@"searchBarSearchButtonClicked");


    searchString = searchBar.text;
    NSLog(@"search %@", searchBar.text);
    [newSearchBar setShowsCancelButton:NO animated:YES];

    [searchBar resignFirstResponder];
    //[self dismissModalViewControllerAnimated:YES];
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar

{  
    NSLog(@" searchBarCancelButtonClicked");


    [searchBar resignFirstResponder];

     shareItemName =newSearchBar.text;

    [self dismissModalViewControllerAnimated:YES];

}

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {

    NSLog(@"searchBarShouldBeginEditing");


    [newSearchBar setShowsCancelButton:YES animated:YES];
    return YES;
}

这些是我的代表

请检查我的代码并给我答案。我需要在加载视图时启用“取消”按钮,它的操作将返回到上一个视图

我需要这样的

否则如何在令人兴奋的取消按钮上添加另一个取消按钮。以便我可以启用它。请给我所有详细信息

【问题讨论】:

  • 方法searchBarCancelButtonClicked被调用了吗?
  • @7KV7 - 如果按钮被禁用,它如何被调用?我的猜测是 UISearchBar 的行为是在搜索文本字段不是第一响应者时禁用取消按钮。
  • 您可以按照stackoverflow.com/questions/4348351/… 中的说明手动强制启用它。

标签: iphone objective-c cocoa-touch uisearchbar


【解决方案1】:

您需要将 UISearchDisplayController 设置为 ACTIVE,如下所示:

 [mySearchDisplayController setActive:YES animated:YES];

或更简单地说:

 mySearchDisplayController.active = YES;

【讨论】:

  • 会不会造成和成为第一响应者一样的效果?意思是,键盘会弹出?
  • 不,我不这么认为——成为第一响应者就是控制键盘。
【解决方案2】:

我的猜测是,Apple 制作 UISearchBar 的方式是,如果搜索文本字段为空或不是第一响应者,则取消按钮被禁用。

这是有道理的,因为除了实际取消搜索之外,您不应将“取消”按钮用于其他目的。并且由于没有要取消的搜索 - 该按钮被禁用。

如果您仍然希望按钮在视图呈现时立即处于活动状态,您可以致电viewWillAppear:[mySearchBar becomeFirstResponder];

这将导致键盘出现并且按钮将被启用。 然后,如果用户点击取消,您可以拦截它以返回上一个视图。 (我不确定苹果是否会喜欢这种行为)。

示例代码:

-(void) viewWillAppear : (BOOL) animated
{
    [super viewWillAppear:animated];
    // Make keyboard pop and enable the "Cancel" button.
    [self.mySearchBar becomeFirstResponder];
}

【讨论】:

  • 它不工作...不知道为什么。我认为这是不可能的,我不希望在单击搜索栏标签文本之前先拉起键盘..因为启用了谓词搜索在表格中单击搜索栏标签文本时,我只需要向上拉键盘
  • 这绝对是可能的,因为我试过了,它奏效了。但是,如果您不希望键盘出现,除了制作您自己的“搜索栏”之外,我看不到其他选择。只是一个带有按钮的文本字段,就可以了。
【解决方案3】:

这是我始终启用取消按钮的做法,即使搜索字段不是第一响应者。

每当我在搜索字段中调用resignFirstResponder 时,我都会调用此方法

- (void)enableCancelButton {
    for (UIView *view in self.searchBar.subviews) {
        if ([view isKindOfClass:[UIButton class]]) {
            [(UIButton *)view setEnabled:YES];
        }
    }
}

这可行,但我不确定它是否会通过 App Store 验证,所以使用它需要您自担风险。此外,这可能仅在取消按钮是您在搜索字段中使用的唯一按钮时才有效。

【讨论】:

  • 这个为什么不通过App Store验证,你用的都是公共API。
  • 这种技术似乎不再起作用了,因为 self.searchBar.subviews 没有任何 UIButton。我刚刚在 iOS 8.x 上尝试/测试过。
【解决方案4】:

这适用于从 iOS 8 开始重新启用取消按钮:

private func enableButtonsInSubviews(view: UIView) {
    if let view = view as? UIButton {
        view.enabled = true
    }

    for subview in view.subviews {
        enableButtonsInSubviews(subview)
    }
}

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多