以前的UITableViews上的indexPathForSelectedRow总是返回nil?

时间:2009-08-22 05:48:02

标签: iphone objective-c uitableview

我有一堆由UINavigationController管理的UITableViews。当我尝试在任何以前的UITableViews上调用indexPathForSelectedRow时,我总是得到nil:

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

我在Apple的文档中找不到任何关于此行为的内容;这是故意的吗?如果是这样,是否还有另一种方法可以做我正在尝试做的事情,而不必在didSelectRowAtIndexPath或某些内容中手动管理冗余的mySelectedIndexPath实例变量?

2 个答案:

答案 0 :(得分:1)

UINavigationController堆栈中的不可见视图可以随时卸载,因此您不能依赖于不可见视图的状态。

您引用的UITableViewController很可能已经卸载了其表视图,在这种情况下,调用[controller tableView]将实例化一个新视图。

答案 1 :(得分: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将不会是nil。

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