【问题标题】:searchBarSearchButtonClicked Not Being Called Despite Delegate being setsearchBarSearchButtonClicked 没有被调用,尽管 Delegate 被设置
【发布时间】:2013-11-26 22:07:51
【问题描述】:

好的,我正在为此拉头发。我几乎可以肯定我曾经也有过这个工作,但现在它不工作了。

我在表格视图单元格中嵌入了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");
}

我已经排除了我所有的 tableview 设置和所有这些,这一切似乎都工作正常。这就是杀死我的原因。一切正常,所有其他委托方法......除了搜索按钮返回。请告诉我我正在做一些愚蠢的事情。我别无选择。

更新 我已经找出了搜索按钮无法执行的罪魁祸首。我删除了所有其他搜索栏委托方法,它开始工作......所以我将它们全部注释掉,直到我发现哪个导致问题。

这家伙是我的罪魁祸首:

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

那么现在,搜索按钮是否真的算作按键操作,我需要将其添加到允许的字符中吗?还是我需要为它添加一张支票以便允许它返回?任何帮助都会很棒。

更新 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];
}

【问题讨论】:

  • 因此,请采纳您的解决方案,将其作为答案,然后选择它作为答案,这样其他人(例如我)就不会阅读本文寻求帮助。
  • 两件事:1) NSCharacterSet -invertedSet 很昂贵,因此您可能需要考虑将 invalidCharSet 缓存为静态常量,以及 2) 更好的方法可能是使用 CFStringTransform 至少去除重音符号& 变音符号优先,这样用户输入可以更宽松。
  • 大卫 H - 我会尽快让我。不幸的是,我回答得太快了。您应该在我的更新中阅读并继续前进,而不是浪费时间添加尖刻的评论。
  • @mattt - 感谢您提供的信息,我一定会将其更新为静态常量。就字符集而言,它是针对客户的,并且是唯一允许的值。

标签: ios ios7 uisearchbar uisearchbardelegate


【解决方案1】:

我在这里回答我自己的问题,这样我就可以结束事情了。在提出问题后不久,我最终解决了这个问题。有趣的是它是如何工作的。答案与其他用户相关,所以我会为后代更新我的答案。

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 就更好的方式限制字符和考虑我的代码库的整体健康状况提出的建议。

【讨论】:

  • 哇不错,这让我发疯了大约 5 分钟,直到我找到你的答案。我还限制了字符集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多