0

私のViewController1はViewController2をプッシュします

ViewController2 *controller =
    [[ViewController2 alloc] init];
[self.navigationController pushViewController:controller
    animated:NO];
[controller release];

ViewController2にはUITableViewがあります...xibファイルでデリゲートをファイルの所有者に接続しました。また、ViewController2には[完了]ボタンがあります

- (IBAction)doneButtonPressed {
     [self.navigationController popViewControllerAnimated:NO];
 }

問題は、テーブルの行と完了ボタンを同時にクリックすると、時々didSelectRowAtIndexPath:ViewController2がポップされた後にメソッドが呼び出され、SIGABRTエラーとこれがロガーに表示されることです。

[__NSCFSet tableView:didSelectRowAtIndexPath:]: unrecognized selector sent to instance 0x62579d0'

では、viewController2をポップした後、tableView:didSelectRowAtIndexPathをどのように呼び出すことができますか?死んでいるはずです...

4

2 に答える 2

2

簡単な修正の 1 つは、次のようにすることです。

- (IBAction)doneButtonPressed {
     self.tableView.delegate = nil;
     [self.navigationController popViewControllerAnimated:NO];
 }

そうすれば、そのビューを離れている間、デリゲート呼び出しが発生しないことが保証されます。これは、View Controller の dealloc メソッドで行うこともできます (おそらく、より適切な場所です)。

于 2012-04-13T14:19:17.310 に答える
1

popViewController&pushViewControllerメソッドはタスクを非同期的に実行します。アニメーション ブロックを使用して、viewController をスライドさせたりスライドさせたりします。ViewController はそのスーパービューから削除され、アニメーション ブロックの完了部分で解放されます。クラッシュはこの遅延によるものです (0.3 秒だと思います)。

于 2012-04-13T14:27:50.737 に答える