UISearchBar не будет скрывать клавиатуру в resignFirstResponder при переходе на другой контроллер представления - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть UISearchBar, который ведет себя нормально - клавиатура пропадает, если я нажимаю «Поиск» или «Отмена».

Однако, когда я помещаю новый контроллер представления в свой стек навигации, если клавиатура открыта, она не закрывается.Он остается там в старом контроллере представления, и если я вернусь к нему, клавиатура все еще будет отображаться.

Я озадачен, потому что мой метод searchBarShouldEndEditing вызывается, как и ожидалось, и я делаю [activeSearchBar resignFirstResponder].Это работает для «Поиск» или «Отмена», но не тогда, когда оно вызывается исчезновением представления.

Мой код делегата:

#pragma mark Search bar delegate methods__________________________

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)activeSearchBar
{
    NSLog(@"searchBarShouldBeginEditing");
    [activeSearchBar setShowsCancelButton:TRUE animated:YES];

    if (!showSearchType)
        return TRUE;

    if([UIView respondsToSelector:@selector(animateWithDuration:animations:)]) {
        // iOS 4.0 and later
        [UIView animateWithDuration:0.3 animations:^ {
            searchTypeView.frame = CGRectMake(0, 44, 320, 69);
            searchTypeView.bounds = CGRectMake(0, 0, 320, 69);
            grayBg.alpha = 0.6;
        }];
    } else {
        // Before iOS 4.0
        searchTypeView.frame = CGRectMake(0, 44, 320, 69);
        searchTypeView.bounds = CGRectMake(0, 0, 320, 69);
        grayBg.alpha = 0.6;
    }

    self.frame = CGRectMake(0, 0, 320, 113);

    [self bringSubviewToFront:searchTypeView];
    [self bringSubviewToFront:activeSearchBar];

    return TRUE;
}


- (BOOL)searchBarShouldEndEditing:(UISearchBar *)activeSearchBar
{
    NSLog(@"searchBarShouldEndEditing");

    if ([activeSearchBar isFirstResponder]) {
        NSLog(@"activeSearchBar isFirstResponder");
    }
    [activeSearchBar resignFirstResponder];

    [activeSearchBar setShowsCancelButton:FALSE animated:YES];

    if (!showSearchType)
        return TRUE;

    if([UIView respondsToSelector:@selector(animateWithDuration:animations:)]) {
        // iOS 4.0 and later
        [UIView animateWithDuration:0.3 animations:^ {
            searchTypeView.frame = CGRectMake(0, 9, 320, 69);
            searchTypeView.bounds = CGRectMake(0, 0, 320, 0);
            grayBg.alpha = 0;
        }];
    } else {
        // Before iOS 4.0
        searchTypeView.frame = CGRectMake(0, 9, 320, 69);
        searchTypeView.bounds = CGRectMake(0, 0, 320, 0);
        grayBg.alpha = 0;
    }

    self.frame = CGRectMake(0, 0, 320, 44);

    return TRUE;
}

- (void)searchBarTextDidEndEditing:(UISearchBar *)activeSearchBar {
    NSLog(@"searchBarTextDidEndEditing");

    if ([activeSearchBar isFirstResponder]) {
        NSLog(@"activeSearchBar isFirstResponder");
    }

    [activeSearchBar resignFirstResponder];

}

- (void)searchBarCancelButtonClicked:(UISearchBar *)activeSearchBar
{
    NSLog(@"searchBarCancelButtonClicked");

    [activeSearchBar resignFirstResponder];
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar
{
    NSLog(@"searchBarSearchButtonClicked");

    self.query = searchBar.text;

    [activeSearchBar resignFirstResponder];

    [searchView startSearch];
}

Это выводит:

2011-12-07 20:00:33.061 MyApp[55725:307] searchBarShouldEndEditing
2011-12-07 20:00:33.063 MyApp[55725:307] activeSearchBar isFirstResponder
2011-12-07 20:00:33.066 MyApp[55725:307] searchBarTextDidEndEditing

Спасибо за любые идеи!

Ответы [ 2 ]

6 голосов
/ 08 декабря 2011

Также вы можете: объявить переменную searchBar в вашем файле .h, создать свойство и т. Д., А затем использовать метод события нажатия кнопки, который выдвигает другое представление, написать первую строку:

[yourSearchBar resignFirstResponder]; 
2 голосов
/ 08 декабря 2011

ОК, я нашел решение, хотя оно и не очень хорошее.

В родительском контроллере представления я поместил следующую строку ДО того, что вызовет запуск нового контроллера представления в стек навигации:

[self.view endEditing:YES];

Это кажется немного хрупким и подверженным ошибкам ... Я хотел бы знать, есть ли лучший способ.

...