我有一堆由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实例变量?
答案 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];
}