0

簡単なテストプロジェクトがあります。ストーリーボードのナビゲーション コントローラー内に埋め込まれた UITableViewController (MasterViewController)。prepareForSegue を使用して別のビュー コントローラー (DetailViewController) にデータを渡すことはありません。代わりに、次のように、didSelectRowAtIndexPath を使用して、detailviewcontroller のラベルを更新します。

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

    detailViewController.passedData = object;
    [self.navigationController pushViewController:detailViewController animated:YES];
}

この時点までのすべてが正常に機能します。

これで、ストーリーボードに別のビュー コントローラーを追加しました。これを最初のビュー コントローラーにして、2 つのコンテナーを追加し、これらのコンテナーに MasterViewController と DetailViewContainer の両方を埋め込みました。

右側の DetailViewController 内に渡されたデータを表示する代わりに、コントローラー ビューを置き換えることで、渡されたデータを左側に表示します。

私が言おうとしていることを明確にできない場合は、ここにプロジェクトへのリンクがあります https://jumpshare.com/v/UiTFEB6AamIo8qX9sinW、学習目的のためだけです。

ありがとう

4

1 に答える 1

2

まだこれを行っているため、この問題が発生しています。

[self.navigationController pushViewController:detailViewController animated:YES];

ここで参照しているナビゲーション コントローラーはマスター コントローラーが埋め込まれているコントローラーなので、detailController のインスタンス (既に画面に表示されているものとは異なります) を作成し、それをナビゲーション コントローラーにプッシュします。

やりたいことは、既に画面に表示されている詳細コントローラーへの参照を取得することです。両方の子ビュー コントローラー (コンテナー ビュー内のもの) は、アプリの起動時に既にインスタンス化されています。したがって、これを行う必要があります:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    DetailViewController *detailViewController = [self.navigationController.parentViewController childViewControllers][1];
    NSMutableString *object = thisArray[indexPath.row];
    detailViewController.passedData = object;
}

これにより詳細コントローラーに値が渡されますが、viewDidLoad のラベルを更新するコードを使用することはできません。そのビューは既に読み込まれており、再度呼び出されることはないからです。代わりに、passedData のセッターをオーバーライドし、そこでラベルを更新します (引数の名前を passedInData に変更したことに注意してください。これにより、プロパティ passedData と競合しなくなります)。

-(void)setPassedData:(NSString *)passedInData {
    passedData = passedInData;
    detailDescriptionLabel.text = passedData;
}

ちなみに、マスター ビュー コントローラーの後に他のコントローラーを追加する予定がない限り、この設定を考えるとナビゲーション コントローラーにそれを埋め込む理由はまったくありません。取り出す場合は、詳細コントローラーへの参照を取得するときに、self.navigationController への参照を削除する必要があります。その場合、次のようになります。

DetailViewController *detailViewController = [self.parentViewController childViewControllers][1];
于 2013-05-05T04:20:38.063 に答える