簡體   English   中英

searchBarSearchButtonClicked盡管代表被設置但未被調用

[英]searchBarSearchButtonClicked Not Being Called Despite Delegate being set

好吧,我把頭發拉過來。 我幾乎可以肯定我在某一點上也有這個工作,現在它不起作用了。

我有一個嵌入在表格視圖單元格中的UISearchBar 我將搜索欄聲明為屬性,我的視圖控制器設置為UISearchBarDelegate 搜索欄已初始化,配置,一切看起來都很棒。 它響應其他委托方法來限制輸入的字符,處理取消按鈕,除了searchBarSearchButtonClicked所有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];
}

我在這里回答我自己的問題,所以我可以把事情搞清楚。 在提出這個問題之后我不久就解決了這個問題。 有趣的是如何工作。 答案與其他用戶有關,所以我會更新我的后代答案。

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提供有關更好地限制字符和思考代碼庫整體運行狀況的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM