Подтвердить что ты не робот

Делегат 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;
}

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

4b9b3361

Ответ 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];
    }
}