好的,我正在为此拉头发。我几乎可以肯定我曾经也有过这个工作,但现在它不工作了。
我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];
}