将数据从UITableViewCell推送到ViewController

时间:2014-08-20 08:40:43

标签: ios objective-c xcode uitableview segue

我正在尝试将数据从UITableViewCell推送到另一个视图控制器。我尝试了两种不同的方式,instantiateViewControllerWithIdentifierPrepareForSegue。在两个实例中,ViewController正确加载但数据未传递(null或第一个数组值)。

这是我的instantiateViewControllerWithIdentifier方法,当我在ViewController中记录变量时,它只返回null。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *testNumber = [jobNumberArray objectAtIndex:indexPath.row];
NSLog(@"Job is... %@",testNumber);
StandardInfoViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"StandardInfoViewController"];
controller.JobNr = [jobNumberArray objectAtIndex:indexPath.row];
[self.navigationController pushViewController:controller animated:YES];
} 

准备争论

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   [self performSegueWithIdentifier:@"Details" sender: self];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"Details"]){
    StandardInfoViewController *controller = (StandardInfoViewController *)segue.destinationViewController;
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    controller.jobNumber = [jobNumberArray objectAtIndex:indexPath.row];
}
}

当我使用prepareForSegue调用时,我得到了我的数组的第一行,我理解它是因为它不知道单元格,但我不知道如何在prepareForSegue调用中识别Cell。

我希望这是有道理的,任何帮助或指示都会受到高度赞赏。

由于

2 个答案:

答案 0 :(得分:2)

如果从故事板中的tableView-cell拖动segue,则会将单元格本身作为参数发送者。

然后您可以使用tableView indexPathForCell:sender来获取所选单元格的实际索引。然后正常获取您的对象。

即。您需要实施didSelectRowAtIndexPath


如果您仍想使用didSelectRowAtIndexPath,请手动将单元格作为sender参数传递。即:

 [self performSegueWithIdentifier:@"Details" 
                      sender:[self.tableView cellForRowAtIndexPath:indexPath]]

虽然您的instansiateViewController的第一个版本应该可以使用,但请根据您的代码进行判断。


另一种模式是将单元格子类化为子类,并让它们具有一个属性,即他们想要显示的对象。然后,您可以直接从单元格中获取对象,而无需调用数据数组本身。

答案 1 :(得分:0)

这是你想要的吗?

这就是你在prepareForSegue方法中识别Cell的方法。

    **UITableViewCell *cell=[myTable cellForRowAtIndexPath:path];**

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"Details"]){
    StandardInfoViewController *controller = (StandardInfoViewController *)segue.destinationViewController;
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

    **UITableViewCell *cell=[self.tableView cellForRowAtIndexPath:indexPath];**
    controller.jobNumber = [jobNumberArray objectAtIndex:indexPath.row];
}
}