Делегат UISearchBar не отвечает на кнопку отмены
У меня есть UIViewController
, который является UISearchBarDelegate
и a MKMapViewDelegate
. Событие searchBarSearchButtonClicked
отлично работает, но при тестировании в iOS 4.2 поискBarCancelButtonClicked никогда не вызывается при нажатии кнопки отмены. В 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;
}
Есть ли у кого-нибудь представление о том, почему это может происходить?
Ответы
Ответ 1
У меня была такая же проблема. Удерживание кнопки отмены в течение нескольких секунд сработало.
Причиной для меня было то, что я реализовал UITapGestureRecognizer в представлении таблицы. Таким образом, это имело приоритет над нажатием кнопки или кнопкой "x" в строке поиска.
Решение в моем случае состояло в том, чтобы ограничить распознавание жестов только фоновым видом таблицы. Я предполагаю, что подобное может произойти в вашем случае. Попытайтесь ограничить распознаватели жестов минимальным требуемым просмотром и панель поиска должна находиться за пределами этого вида.
Ответ 2
Вероятно, ваш sbar-объект освобождается, в этом случае это объект автореферата, Why?. Попробуйте объявить sBar как свойство IBOutlet. Сделайте апикальные ссылки в построителе интерфейса, удалите выделение, когда вы его код, поместите в viewDidUnload
self.sbar = nil;
и освобождает его в dealloc. в viewDidLoad поместите это.
sBar.delegate = self;
sBar.showsCancelButton = YES; // this is an option in object inspector
[self.view addSubview:sBar];
[sBar becomeFirstResponder]; //remove this.
Скажите, если это работает
Ответ 3
попробуйте следующее:
sBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320.0, 70.0)];
sBar.delegate = self;
sBar.showsCancelButton = YES;
[self.view addSubview:sBar];
и попробуйте поставить release в dealloc
Ответ 4
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == self.searchDisplayController.searchResultsTableView)
{
[self.searchDisplayController setActive:NO animated:YES];
[self.searchDisplayController.searchBar resignFirstResponder];
}
}