【问题标题】:Pushing Data from UITableViewCell to ViewController将数据从 UITableViewCell 推送到 ViewController
【发布时间】:2014-10-13 13:13:39
【问题描述】:

我正在尝试将数据从 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 调用中识别单元格。

我希望这是有道理的,任何帮助或指点将不胜感激。

谢谢

【问题讨论】:

  • JobNr 是如何声明的?
  • JobNr 在我的 ViewController.h 中被声明为 NSString
  • 嗯,这很明显。但是怎么做?
  • 抱歉。 @property (nonatomic, 保留) NSString *JobNr;
  • NSString 应始终声明为copy

标签: ios objective-c xcode uitableview segue


【解决方案1】:

如果您从情节提要中的 tableView-cell 拖动 segue,您将获得单元格本身作为参数发送者。

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

即你将不需要实现didSelectRowAtIndexPath


如果您仍想使用didSelectRowAtIndexPath,只需手动将单元格作为发件人参数传递。即:

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

虽然从您的代码来看,您使用 instansiateViewController 的第一个版本应该可以工作。


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

【讨论】:

  • 非常感谢!我花了一段时间,因为我正在更改代码并且忘记了我所做的事情,但“tableView indexPathForCell:sender”工作得很好!
【解决方案2】:

这是你想要的吗?

这就是您在 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];
}
}

【讨论】:

    猜你喜欢
    • 2015-04-04
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多