2009-08-22 10 views
1

私はUINavigationControllerによって管理されるUITableViewsのスタックを持っています。私は以前UITableViewsのいずれかにindexPathForSelectedRowを呼び出すしようとすると、私はいつもnilを取得:以前のUITableViewsのindexPathForSelectedRowは常にnilを返しますか?

NSEnumerator *e = [[navigationController viewControllers] objectEnumerator]; 
UITableViewController *controller; 
while (controller = [e nextObject]) { 
    NSIndexPath *selectedIndexPath = [[controller tableView] indexPathForSelectedRow]; // always nil 
    // ... 
}

私はAppleのドキュメントには、この動作については何も見つけることができません。意図的ですか?もしそうなら、didSelectRowAtIndexPathやsomesuchの中の冗長なmySelectedIndexPathインスタンス変数を手動で管理する必要はありませんが、私がやろうとしていることをやり遂げる別の方法がありますか?

+0

これは動作するはずです。 navigationControllerが正しいオブジェクトを参照していない可能性があります。どのようにしてスタックにプッシュするビューにnavigationContollerを取得しますか?興味深い; – VoidPointer

答えて

1

UINavigationControllerスタックにおける非可視ビューは、したがって、あなたは、不可視のビューの状態に依存しないことができ、いつでもアンロードすることができます。

参照しているUITableViewControllerが既にテーブルビューをアンロードしている可能性があります。この場合、[controller tableView]を呼び出すと新しいビューがインスタンス化されます。

+0

;情報をありがとう。これはどこに文書化されていますか? –

+0

UIViewControllerのドキュメントの「メモリの管理」を参照してください。 – Darren

1

私はこれもiPad上で、スプリットスクリーンのビュー(左と右の詳細ペイン)で気づいていました。ちょっと迷惑です。ただし、viewWillAppearをオーバーライドすると、の[super viewWillAppear]を呼び出す前に、テーブルビューの選択した行を取得できることがわかりました。

あなたは、このようないくつかのコードを持っていたのであれば、indexPathForSelectedRowがnilになり、

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    if(![_self.tableView indexPathForSelectedRow]) 
    { 
     NSLog(@"nothing selected, so selecting 1st one"); 
      // sets the detail pane here. 
    } 
} 

が、コードは(viewWillAppearの点に注意してください。最後に)このようなものだった場合、indexPathForSelectedRowゼロではないでしょう。

- (void)viewWillAppear:(BOOL)animated { 
    if(![_self.tableView indexPathForSelectedRow]) 
    { 
     NSLog(@"nothing selected, so selecting 1st one"); 
       // sets the detail pane here. 
    } 
    [super viewWillAppear:animated]; 
} 
+0

Hackishですが、動作します –

+0

これは動作するように思われる唯一の理由は、あなたがUITableViewControllerを使用していて、clearsSelectionOnViewWillAppearがデフォルトでYESになっているからです。 clearsSelectionOnViewWillAppearをNOに設定し、選択した行にアクセスできるようにする必要があります。ただし、UITableViewControllerが選択を解除することを恐れることなく好きです。 –

関連する問題