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

このコードは、NavigationViewController viewDidLoad メソッドから navigationController スタックにプッシュされる TableViewController の viewDidLoad メソッドにあります。

これを機能させるためにおそらく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];

autorelease... に設定されたオブジェクトを解放することは、メモリ管理で最も一般的なエラーに違いありません。その行を削除する[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 に答える