Ios searchBarSearchButtonClicked未被调用,尽管已设置委托

Ios searchBarSearchButtonClicked未被调用,尽管已设置委托,ios,ios7,uisearchbar,uisearchbardelegate,Ios,Ios7,Uisearchbar,Uisearchbardelegate,好吧,我正为此发愁呢。我几乎可以肯定,我也曾有过这样的经历,但现在它不起作用了 我在表视图单元格中嵌入了一个UISearchBar。我将搜索栏声明为属性,我的视图控制器设置为UISearchBarDelegate。搜索栏已初始化、配置,一切看起来都很好。它响应其他委托方法来限制输入的字符,处理取消按钮,除searchBarSearchButtonClicked之外的所有操作。我到底做错了什么 以下是我的基本设置: ViewController.h @interface SearchML

好吧,我正为此发愁呢。我几乎可以肯定,我也曾有过这样的经历,但现在它不起作用了

我在表视图单元格中嵌入了一个
UISearchBar
。我将搜索栏声明为属性,我的视图控制器设置为
UISearchBarDelegate
。搜索栏已初始化、配置,一切看起来都很好。它响应其他委托方法来限制输入的字符,处理取消按钮,除
searchBarSearchButtonClicked之外的所有操作。我到底做错了什么

以下是我的基本设置:

ViewController.h

    @interface SearchMLSNumberViewController : UIViewController <UISearchBarDelegate>

    @property (strong, nonatomic) UISearchBar *searchField;

ViewController.m

// viewDidLoad
// init the search bar
self.searchField = [[UISearchBar alloc] init];
self.searchField.delegate = self;
self.searchField.autocorrectionType = UITextAutocorrectionTypeNo;
self.searchField.placeholder = NSLocalizedString(@"Search", @"Search");

// in my cell setup
CGRect frame = cell.contentView.frame;
[self.searchField setFrame:frame];
[cell.contentView addSubview:self.searchField];

// here is the delegate call that never fires for me
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    NSLog(@"search button pressed");
}
那么现在,搜索按钮是否算作按键,我需要将其添加到允许的字符中?或者我需要为它添加一张支票以便允许它返回?任何帮助都会很好

更新2 我已经解决了我的问题。它综合了线索和启示,但我最终还是成功了。罪犯不允许在字符集中使用返回键。我将\n添加到字符集,瞧,搜索按钮工作不正常。这是我更新的过滤器逻辑,以显示添加的返回键,以及针对我的情况的有效字符集。一旦我被允许,我会自己回答

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ,-\n"] invertedSet];
    NSString *filtered = [[text componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
    return [text isEqualToString:filtered];
}

我在这里回答我自己的问题,这样我就可以结束事情了。我在提出这个问题后不久就解决了这个问题。真有趣。答案与其他用户相关,因此我将为后代更新我的答案

tl;dr是因为我不允许在
-shouldChangeTextInRange
中使用返回键。我有一个允许输入的有限字符集,我忘记了将返回键作为有效字符包含在内

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ,-\n"] invertedSet];
    NSString *filtered = [[text componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
    return [text isEqualToString:filtered];
}
如果您限制文本字段中的字符,这也可能起作用。这就是我最终解决问题的原因。我从删除所有委托方法开始,直到我发现是哪个方法阻止了我。一旦我弄明白我在做什么,我就通过搜索文本字段问题来跟踪返回键。搜索栏没有太多问题,这就是我最后问这个问题的原因。我可能没问这个问题就明白了这一点,但至少我学到了一些东西,希望这个答案能在将来帮助其他人


另外,感谢@mattt就限制字符和考虑我的代码库整体健康状况的更好方法提供的建议。

因此,采用您的解决方案,将其作为一个答案,并选择它作为答案,这样其他人(如我)就不会去读这篇文章寻求帮助。两件事:1)
NSCharacterSet-invertdset
非常昂贵,因此,您可能需要考虑缓存>代码> SuffIDCARSETA/COD>作为静态常量,2)一个更好的方法可能是首先使用CFSTRIGIN转换至少带口音和发音符号,以便用户输入可以更宽松。戴维H-我会尽快让我。不幸的是,我回答得太快了。你应该在我的更新中读到这一点,然后继续,而不是浪费时间添加尖刻的评论。@mattt-谢谢你提供的信息,我一定会将其更新为静态常量。就角色集而言,这是为客户提供的,这些是唯一允许的值。哇,接球不错,这让我疯狂了大约5分钟,直到我找到了你的答案。我还限制了角色集。
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ,-\n"] invertedSet];
    NSString *filtered = [[text componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
    return [text isEqualToString:filtered];
}