2

ビューコントローラーをセグエで移行しているとしましょう。View Controller 1にtextFieldがあり、2番目のView Controllerにラベルがあります。2番目のView Controllerにセグエするときは、次のコードでラベルを簡単に設定できます:

ビューコントローラー #2

-(void) viewWillAppear: (BOOL) animated
{ 
 self.labelVC2.text = ((VC1 *)self.presentingViewController).textFieldVC1.text;
}

これは完全に理にかなっています。この場合、presentingViewController プロパティが使用されています。presentedViewControllerプロパティがいつ使用されるかを把握しようとしている間、次のようにprepareForSegueメソッドの最初のView Controllerから使用されるのは論理的だと思われます。

ビューコントローラー #1

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
    if([[segue identifier] isEqualToString:@"SegueToNextVC"])
    {
       ((VC2 *)self.presentedViewController).labelVC2.text = self.textFieldVC1.text;
    }
 }

ただし、これは機能していないようで、セグエが発生する直前に prepareForSegue で 2 番目のビュー コントローラーの新しいインスタンスが呼び出され、設定したばかりのプロパティが失われるためだと思います。私がこれで正しければ、presentedViewControllerプロパティを使用するのに適切な時期はいつですか? クラスに直接アクセスできるため、2番目のView Controllerでこのプロパティを使用しないことは明らかです。

4

1 に答える 1

0

のクラスリファレンスを見てくださいUIStoryboardSegue。これには、非常に役立つと思われるいくつかのプロパティがあります。

sourceViewController- 「...内容がセグエの先頭に表示されるビュー コントローラ」、つまりself

destinationViewController-「...セグエの最後にコンテンツを表示する必要があるビューコントローラー」は、あなたVC2がアクセスしようとしているものですself.presentedViewController

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
    if([[segue identifier] isEqualToString:@"SegueToNextVC"])
    {
       ((VC2 *)destinationViewController).labelVC2.text = self.textFieldVC1.text;
    }
 }

質問に戻りますが...いつ使用したいpresentedViewControllerですか? 答えは、への参照をまだ持っていないときはいつでもですpresentedViewController。これが例です。

すべて同じ親を持つクラスがたくさんあります。SubViewController1SubViewController2SubViewController3これらはすべてのサブクラスでありMyViewController、現在表示されている場合と表示されていない場合があります。そのため、存在するかどうかを確認し、実行していることを終了して終了するように伝えます。MyViewController幸いなことに、まさにそれを可能にする方法があります。

if (self.presentedViewController) {
    MyViewController *subVC = (MyViewController *)self.presentedViewController;
    [subVC finishAndGoAway];
}

これは、使用できる場所の一例にすぎません。それが役立つ状況は他にもたくさんありますが、表示されるものへの参照が既にあるため、デフォルトのものを使用する必要がないため、まったく意味がない場合もたくさんあります。

于 2013-02-14T19:32:54.657 に答える