0

親View Controllerのメソッドから子View Controllerのテキストビューのテキストを変更する必要があるアプリに取り組んでいます。

子 VC にボタンがあります。ボタンを押してもビューは変わりませんが、親 VC のメソッドが呼び出され、親 VC の別のメソッドが子 VC のテキスト ビューのテキストを変更します。

[self.delegate buttonPressed];//in child VC, call method in parent VC

ストーリーボードを使用する前は機能していました。親VCには、以下のコードがありました。

childViewControler.textViewName.text=@"something";

これでストーリーボードに変更し、NSLog を使用して、テキストを変更するメソッドが呼び出されることを知りました。しかし、テキストは表示されません。今ストーリーボードを使っているので、何か追加するかもしれないと思っていますか?誰かアドバイスをくれませんか?ありがとうございました。

4

1 に答える 1

1

親View ControllerのchildViewControler変数は、セグエによって作成された子View Controllerクラスのインスタンスを指す必要があります。何も割り当てない場合、それは であり、それへのnilメッセージは何もしません。

投稿したコードからは、それがプロパティ、インスタンス変数、ローカル変数のいずれであるかは不明です。インスタンス変数を使用してそれを行う方法は次のとおりです。

@implementation ParentViewController
{
    ChildViewController *childViewController;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // if you have multiple segues, check segue.identifier
    // so you only do this for the correct segue
    childViewController = segue.destinationViewController;
}

- (void)buttonPressed
{
    childViewController.textViewName.text=@"something";
}
@end

キービットが入っています。セグエによって作成されたView Controllerを変数が指してprepareForSegue:sender:いることを確認する必要があります。childViewController


また、ストーリーボード前の古いコードがまだ残っているために問題が発生する可能性もありますalloc。これは、子ビュー コントローラーを変数initに入れます。childViewControllerその場合、そのビュー コントローラー クラスの 2 つのインスタンスが存在します。1 つはセグエによって作成されたもので、もう 1 つは作成したものです。セグエによって作成されたものだけが UI にフックされるため、他のものに加えた変更は表示されません。この問題は、子ビュー コントローラーを作成して表示するコードを削除することで解決できます。ストーリーボードがすべてを処理prepareForSegue:sender:し、子ビュー コントローラーへの参照を取得するために必要な唯一の場所になります。

于 2012-07-17T15:26:33.480 に答える