2
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");
}

此代码位于 TableViewController 的 viewDidLoad 方法中,该方法从 NavigationViewController viewDidLoad 方法推送到 navigationController 堆栈中。

我花了大约 3 个小时试图让它工作,但无济于事。

4

3 回答 3

1

像往常一样,内存管理是罪魁祸首。从 navigationController 加载 tableViewController:

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

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

释放一个设置为自动释放的对象...一定是内存管理中最常见的错误。删除该行 [tableController release] 解决了问题

于 2009-06-30T14:45:41.910 回答
0

如果您@selector(refreshAction)在创建按钮时指定,那么幸运,即:

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

如果您没有向初始化程序指定操作,则可能不会保存目标。

于 2009-06-30T14:29:00.353 回答
0

我不完全 100% 确定您的代码为什么不起作用,但是直接在构造函数中设置选择器确实有效:

UIBarButtonItem *rButton = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh   
                         target:self 
                         action:@selector(refreshAction)];
于 2009-06-30T14:29:19.230 回答