4

簡単なテスト アプリで、"thisArray" という名前の配列オブジェクトを から "passedData"MasterViewControllerという名前の文字列に渡そうとしました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 replaceを正しく書く方法はprepareForSegue?

2)を使用する場合、ストーリーボードdidSelectRowsAtIndexPathの 間のセグエ接続を削除する必要がありUIViewControllerますか?

3)ビュー コントローラー間にセグエ接続が実際にない場合、どのように使用してそれらの間でデータを渡すことができdidSelectRowAtIndexPathますか?

ありがとう!

更新: 回答と受け取ったコメントに基づいて、次のように書きました。

最初に、コントローラー間のセグエ接続を削除し、StoryBoard 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

4

1 に答える 1

10

2 回目の試行はほぼ正しいです。完全に正しくない唯一のことは、ストーリーボードからビュー コントローラーをインスタンス化する方法ですinitWithNibNamed:。これは、ストーリーボードではなく NIB で使用するものです。ストーリーボードの場合、これが必要です。

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];
}
于 2013-05-05T00:07:16.093 に答える