UISearchBar делегат не отвечает на кнопку отмены - PullRequest
14 голосов
/ 14 мая 2011

У меня есть UIViewController, то есть UISearchBarDelegate и MKMapViewDelegate.Событие searchBarSearchButtonClicked работает нормально, но при тестировании в iOS 4.2 searchBarCancelButtonClicked никогда не вызывается при нажатии кнопки отмены.В 4.3 все отлично работает.У меня есть другие взгляды с идентичным кодом, и он отлично работает.Я трижды проверил подписи метода.

Может ли это быть что-то делать с MapView, или я делаю что-то явно неправильно?

Мой .h файл:

@interface MyViewController : UIViewController <UISearchBarDelegate,MKMapViewDelegate,UIAlertViewDelegate>{
MKMapView *mapMainView;
UISearchBar *sBar;

}

@property (nonatomic, retain) UISearchBar *sBar;
@end

И я создаю панель поискавот так:

sBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320.0, 70.0)] autorelease];
sBar.delegate = self;
sBar.showsCancelButton = YES;
[self.view addSubview:sBar];
[sBar becomeFirstResponder];

Метод:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
searchBar.hidden = YES;
}

Кто-нибудь имеет представление о том, почему это может происходить?

Ответы [ 4 ]

21 голосов
/ 07 сентября 2011

У меня была точно такая же проблема. Удерживание кнопки отмены в течение нескольких секунд сработало.

Причиной для меня было то, что я реализовал UITapGestureRecognizer в табличном представлении. Таким образом, это имеет приоритет над нажатием кнопки или кнопки «х» в строке поиска.

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

4 голосов
/ 19 мая 2011

Вероятно, ваш объект sbar освобождается, в данном случае это объект автоматического выпуска. Почему? Попробуйте объявить sBar как свойство IBOutlet. Сделайте соответствующие ссылки в Интерфейсном Разработчике, удалите alloc при кодировании, поместите в viewDidUnload self.sbar = ноль; и выпускает его в dealloc. во viewDidLoad поместите это.

sBar.delegate = self;
sBar.showsCancelButton = YES; // this is an option in object inspector
[self.view addSubview:sBar];
[sBar becomeFirstResponder]; //remove this.

Подскажите, работает ли он

1 голос
/ 12 апреля 2013
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        [self.searchDisplayController setActive:NO animated:YES];
        [self.searchDisplayController.searchBar resignFirstResponder];
    }
}
1 голос
/ 23 июля 2011

попробуйте это:

sBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320.0, 70.0)];

sBar.delegate = self;

sBar.showsCancelButton = YES;

[self.view addSubview:sBar];

и попробуйте поставить релиз в dealloc

...