簡體   English   中英

按下鍵盤並輕按x時在UISearchBar上執行操作

[英]Perform action on UISearchBar when Keyboard is down and the x has been tapped

我有一個頂部帶有UISearchBarUITableView ,並且有一個不起作用的特定要求。

我的UISearchBar (showsCancelButton = NO)上沒有取消按鈕UISearchBar (showsCancelButton = NO)因此我完全依賴UISearchBar內的x來取消現有搜索。 我依靠鍵盤的“搜索”按鈕關閉鍵盤(盡管在我的情況下稱為“完成”)。

當用戶在我的應用程序中搜索時,我將禁用navigation bar button項,因為它給用戶帶來不好的體驗,並且只有在搜索取消后,用戶才能重新獲得導航欄按鈕項。 都可以了

我有一個特殊的場景,盡管我無法繞開。

1)點擊搜索欄以輸入文本

2)在鍵盤上單擊“完成”,鍵盤將消失

3)在鍵盤退回的情況下,x保留在UISearchBar

4)點擊UISearchBar的x, SearchBar的文本消失,視圖刷新

5)此時,應該再次啟用導航欄按鈕,但是沒有啟用。

碼:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    self.timelineSearchBar.showsCancelButton = NO;
    if ([searchText length] == 0)
    {
        [self.timelineSearchBar performSelector:@selector(resignFirstResponder)
                    withObject:nil
                  afterDelay:0];
    }

我知道上面的代碼旨在在按下x時關閉鍵盤,這很好。

就我而言,鍵盤已經被辭職了,因此我希望點擊x即可重新啟用導航欄項。

    self.addButton.enabled = YES; 

因為上面的if語句根本不執行任何操作,並且導航欄項仍處於禁用狀態。

我什至嘗試了if語句:

[self.timelineSearchBar performSelector:@selector(enableAdd)
                    withObject:nil
                  afterDelay:0];

- (void)enableAdd
{
    self.addButton.enabled = YES;
}

但這會崩潰,說明searchBar不響應該enableAdd選擇器。

我已經完成了一個斷點,並且看到當我點擊x時,上面的if語句的評估結果為true,它進入該語句,它“運行”代碼以啟用該按鈕,但從未發生。

我的最終編輯方法是:

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:NO animated:YES];
    self.addButton.enabled = YES;
}

更新:我已經嘗試過這里的鏈接http://engineeringtheworld.wordpress.com/2011/04/11/detecting-when-clear-is-clicked-in-uisearchbar-x-button/沒有成功-textField的shouldClear方法不會被調用。 我正在使用iOS 7,所以也許還有另一種方法可以將視圖嵌入到textFields中? 這很可能是正確的方法,但是它不適用於我的代碼,因為該示例中的for語句永遠不會被評估為true(我放入NSLog中)。

更新2:從上面的if語句中,我調用了searchBarCancelButton方法,並且導致了極端循環,因此,這當然不是正確的方法:

[self performSelector:@selector(searchBarCancelButtonClicked:) withObject:self.timelineSearchBar afterDelay: 0];

任何對此的指導將不勝感激。 我知道我錯過了關鍵一步,但我只是想不通。

問題是,輕敲X按鈕時, searchBar:textDidChange: 之前被稱為searchBarShouldBeginEditing:

即,這里是調用流程: searchBar:textDidChange: -> searchBarShouldBeginEditing: -> searchBarTextDidBeginEditing: -> searchBarTextDidEndEditing:

textDidChange的設置啟用為YES,但然后shouldBeginEditing再次將其禁用。 這對我來說非常合適:

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    self.addButton.enabled = NO;
}

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    if(searchBar.text.length == 0){
        self.addButton.enabled = YES;
    }
}

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if ([searchText length] == 0)
    {
        [searchBar performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0];
    }
}

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    self.addButton.enabled = [searchBar.text length] == 0;
    [searchBar resignFirstResponder];
}
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if([searchText length] == 0 && searchBar.text.length == 0)
    {
        self.addButton.enabled = YES;
        [searchBar performSelector: @selector(resignFirstResponder)
                    withObject: nil
                    afterDelay: 0.1];
    }
}

為了清楚起見,我在這里創建一個答案,但是盡管我的代碼可以正常工作,但是Michaels的答案在很大程度上為這提供了幫助,並且是這里公認的方法。

我對NSLogs進行了很多研究,有趣的是,我發現shouldBeginEditing出現在textDidChange之前(按照textDidChange的順序)。

但是,我還注意到,在原始問題的步驟中,關閉了鍵盤,並在UISearchBar中包含了文本,並且x可見,如果我輕按x,則不會出現鍵盤,但是它再次調用了shoudlBeginEditing

這是導致addButton繼續變灰的方法,因為該方法將該按鈕設置為禁用。

所以我調整了代碼:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)bar
{
    NSLog(@"Should begin");
    if ([self.timelineSearchBar.text length] > 0)
    {
        self.addButton.enabled = NO;
    }
    else
    {
        self.addButton.enabled = YES;
    }
    self.timelineSearchBar.showsCancelButton = NO;
    BOOL boolToReturn = self.shouldBeginEditing;
    self.shouldBeginEditing = YES;
    return boolToReturn;
}

我將if條件放在其中,以便在用x取消后返回到searchBar時,代碼可以適當地做出反應。

這樣,添加按鈕不會在我單擊UISearchBar (彈出鍵盤)后立即禁用。 但是,在textDidChange (這是我看到的從鍵入的第一個字母開始調用的內容)中,我也設置了以下條件:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    NSLog(@"Text did change");
    self.timelineSearchBar.showsCancelButton = NO;
    if ([self.timelineSearchBar.text length] > 0)
    {
        self.addButton.enabled = NO;
    }
...
}

這樣, UISearchBar僅在我開始輸入字母時才顯示添加按鈕。 這為我工作,因為如果用戶輕敲上UISearchBar並沒有在任何類型,在prepareForSegue那去認為,添加條目在呼喚,我檢查,如果搜索欄isFirstResponder如果是這樣,我resignFirstResponder

考慮到這一點,我不確定這是否是Apple的處理方式,但這很干凈。 我會盡快知道我的應用是否因此而因此而被拒絕,但是非常感謝Michaels的幫助; 您確實為解決整個我整個下午問題的正確方向指明了方向!

暫無
暫無

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

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