UIBarButtonItem завершает работу приложения iphone при нажатии кнопки

StackOverflow https://stackoverflow.com/questions/1063496

Вопрос

UIBarButtonItem *rButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:NULL];

rButton.action = @selector(refreshAction);
self.navigationItem.rightBarButtonItem = rButton;
[rButton release];

Приведенный выше код отлично работает для создания кнопки и добавления ее на панель навигации, но когда я нажимаю на кнопку, приложение завершает работу с EXC_BAD_ACCESS.Если я закомментирую RButton.action = @selector(refreshAction);нажатие на кнопку ничего не даст, но и не приведет к сбою.

- (void)refreshAction {
    NSLog(@"refreshAction");
}

Этот код находится в методе viewDidLoad TableViewController viewDidLoad, который помещается в стек NavigationController из метода viewDidLoad NavigationViewController.

Я потратил, наверное, 3 часа, пытаясь заставить это сработать, но безрезультатно.

Это было полезно?

Решение

Как обычно, виной всему было управление памятью.Загрузка TableViewController из NavigationController:

NearbyTableViewController *tableController = [[[NearbyTableViewController alloc] initWithNibName:@"NearbyTableViewController" bundle:nil] autorelease];
self.nearbyTableController = tableController;   

[self pushViewController:self.nearbyTableController animated:YES];
[tableController release];

освобождение объекта, установленного для автоматического освобождения...должно быть, это самая распространенная ошибка в управлении памятью.Удаление этой строки [TableController release] решило проблему

Другие советы

Будет ли удача, если вы укажете @selector(refreshAction) когда вы создаете кнопку, т.е.:

UIBarButtonItem *rButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshAction)];

Возможно, цель не будет сохранена, если вы также не укажете действие для инициализатора.

Я не совсем на 100% уверен, почему ваш код не работает, но установка селектора непосредственно в конструкторе действительно работает:

UIBarButtonItem *rButton = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh   
                         target:self 
                         action:@selector(refreshAction)];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top