通过视图控制器DidSelectRowsAtIndexPath故事板之间的数据(Passing Da

2019-09-01 23:52发布

在一个简单的测试应用程序,我试图通过名为“thisArray”从数组对象MasterViewController到名为“passedData”中的一个字符串DetailViewController 。 我现在用故事板和UIViewController嵌入导航控制器内。 使用prepareForSegue方法,我顺利地通过了之间的数据UIViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"pushData"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        DetailViewController *destViewController = segue.destinationViewController;
        destViewController.passedData = [thisArray objectAtIndex:indexPath.row];
    }
}

现在,由于某些原因我想用didSelectRowsAtIndexPath而不是prepareForSegue 。 我已经使用这个:

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSMutableString *object = thisArray[indexPath.row];
    detailViewController.passedData = object;   
}

但它没有工作。 我已经使用了以下情况:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

    NSMutableString *object = thisArray[indexPath.row];
    detailViewController.passedData = object;
    [self.navigationController pushViewController:detailViewController animated:YES];  
}

但它也没有工作。

问题

1)如何正确书写didSelectRowsAtIndexPath更换prepareForSegue

2)如果我使用didSelectRowsAtIndexPath ,我是否需要删除之间的连接赛格瑞UIViewController在故事板?

3)如果有什么是视图控制器之间真的没有SEGUE连接,我怎么能仍然使用通过它们之间的数据didSelectRowAtIndexPath

谢谢!

更新:根据答案,我收到的意见,我已经写了以下内容:

首先,我已经删除了控制器之间的连接赛格瑞,设置故事板ID DetailViewController ,类的名字也DetailViewController

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"DetailViewController"
                                                  bundle:nil];
    UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"DetailViewController"];

    NSMutableString *object = thisArray[indexPath.row];
    detailViewController.passedData = object;
    [self.navigationController pushViewController:detailViewController animated:YES];
}

但其得到开车撞以下错误:

***终止应用程序由于未捕获的异常NSInvalidArgumentException ,原因是:“找不到一个名为情节串连图板DetailViewController捆绑

Answer 1:

你的第二个尝试是接近直角的。 这是不完全正确的唯一的事情是你实例从故事板视图控制器的方式:你用initWithNibNamed:这是你与发钞银行,但不与故事板用什么。 对于故事板,你需要这样的:

UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"theStoryboardId"
                                          bundle:nil];
// If this code is inside a method called by a controller that is itself instantiated
// from a storyboard, you can replace the above line with this.storyboard
UIViewController* detailViewController = [sb instantiateViewControllerWithIdentifier:@"DetailViewController"];

见这个问题的详细信息。

一旦你做出了更换,按照预期的代码应工作。

编辑:下面是你的方法看起来:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIViewController* detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
    NSMutableString *object = thisArray[indexPath.row];
    detailViewController.passedData = object;
    [self.navigationController pushViewController:detailViewController animated:YES];
}


文章来源: Passing Data Between View Controllers DidSelectRowsAtIndexPath Storyboards