0

我有两个表视图控制器,一个包含所有美国州,另一个显示所选州的数据列表。我已经从视图控制器(不是单元格)在我的主故事板中设置了一个 segue,并给它一个标识符。由于超出本文范围的原因,我需要在不使用 prepareForSegue 方法的情况下以编程方式执行 segue。

源表视图控制器(AllStatesTableViewController)需要在tableview的didSelectRowAtIndexPath方法中执行segue。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    stateID = [statesDict objectForKey:cell.textLabel.text];

    DetailTableViewController *destination = [[DetailTableViewController alloc] init];

    stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateID andType:nil];
    // at this point stateGauges is NOT nil

    [destination setStateGauges:stateGauges];

    [self performSegueWithIdentifier:@"sgShowStateDetail" sender:self];
}

segue 按预期执行,因为它导航到其目的地,但在目标表视图控制器中 stateGauges 为 nil。在源表视图控制器中它不是 nil。stateGuages 被声明为 DetailTableViewController 中的属性。显然我做错了什么。有什么建议么?

谢谢!五

4

2 回答 2

4

在您的故事板上,您需要选择将您的转场从您的单元格中推出。

在此处输入图像描述 在此处输入图像描述

并使用您prepareForSegue传递数据:

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

        // Pass data here
        destViewController.stateGauges = stateGauges;
    }
}

这里查看更多信息

于 2013-10-14T16:06:44.837 回答
1

我以前也遇到过这个。我发现当我让情节提要处理转场时,它会实例化一个新的视图控制器。这就是为什么 stateGauges 为 nil 的原因,因为您在以编程方式创建的视图控制器中设置了 stateGauges,而不是故事板创建的那个。如果您不使用 prepareForSeque,请从您的 AllStatesViewController 中删除 segue 到情节提要中的 DetailTableViewController。然后以编程方式实例化故事板、视图控制器、setGauges,然后呈现您的视图控制器。此外,请确保将“ShowStateDetail”放在情节提要中的 DetailTableViewController 的“身份”部分的“情节提要 ID”字段中。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    stateID = [statesDict objectForKey:cell.textLabel.text];

    DetailTableViewController *destination = [[UIStoryboard storyboardWithName:@"yourStoryBoardName" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ShowStateDetail"];

    stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateID andType:nil];

    [destination setStateGauges:stateGauges];

    [self presentViewController:destination animated:YES completion:nil];
}
于 2013-10-14T22:39:09.487 回答