【发布时间】:2012-03-14 05:08:54
【问题描述】:
我有一个 UITableView 显示来自 plist 文件的数据。对于这个表格视图,我只是从 plist 文件的内容中创建了一个 NSArray 并将数据输入到每个单元格中。但是当一个单元格被点击时,我需要下一个表格视图控制器知道被点击的单元格的索引路径,以便这个视图控制器知道数组中的哪个项目要显示详细信息。我试过以下方法:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
staffDetailView = [[StaffDetailViewController alloc] init];
[staffDetailView setSelectedIndexPath:indexPath];
[self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
上面,我试图将点击单元格的索引路径传递给我在新视图控制器中创建的NSIndexPath 对象。
下一个表格视图控制器的头文件:
@interface StaffDetailViewController : UITableViewController {
NSIndexPath *selectedIndexPath;
NSArray *staffArray;
}
@property (nonatomic, retain) NSIndexPath *selectedIndexPath;
@property (nonatomic, strong) NSArray *staffArray;
这里我定义了在前一个视图控制器中设置的selectedIndexPath 对象。
但是当我尝试访问selectedIndexPath 对象以显示相关数据时,该对象似乎是nil:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString *header;
if (section == 0) {
NSString *name = [[staffArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Staff Member"];
NSArray *splitStaffArray = [name componentsSeparatedByString:@", "];
NSString *lastName = [splitStaffArray objectAtIndex:0];
NSString *firstName = [splitStaffArray objectAtIndex:1];
NSString *consolidatedName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
NSString *assignment = [[staffArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Assignment"];
header = [NSString stringWithFormat:@"%@\n%@", consolidatedName, assignment];
return header;
}
return nil;
}
我是否错误地访问了selectedIndexPath 对象?有没有更好的方法将正确的索引路径传递给下一个视图控制器?
【问题讨论】:
-
为什么不简单地转发对象实例而不是它的indexPath?
-
我有多个要显示的对象实例,我认为为了效率,最好只传递索引路径并让下一个视图控制器负责检索数据。不过,我会再次尝试这种方法。
-
采用这种方法返回 null。
-
那你就做错了 - 在问题中向我们展示你的替代代码,作为解决问题的额外尝试。
-
按照 'Till' 的建议去做。将索引路径处的对象传递给子视图控制器。从数组的另一个实例重新获取是不必要的开销。只是传递你需要的东西。
标签: iphone ios uitableview nsindexpath