10

メインの UIViewController で、ホームスクリーン ビュー コントローラーをサブビューとして追加しています。

   UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:vc];
        controller.navigationBarHidden = YES;
        controller.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
        [self addChildViewController:controller];
        [self.view insertSubview:controller.view atIndex:0];
        [controller didMoveToParentViewController:self];    

問題は、viewDidAppear と viewWillAppear が、viewDidLoad と同じように 1 回だけ呼び出されることです。どうしてこれなの?どうすればこれを機能させることができますか?

基本的に vc 内では、viewDidAppear も viewWillAppear も取得していません。

また、ナビゲーションコントローラーなしで UIViewController を追加しようとしましたが、まだ機能しません:

vc.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
        [self addChildViewController:vc];
        [self.view insertSubview:vc.view atIndex:0];
        [vc didMoveToParentViewController:self];    
4

8 に答える 8

14

子コントローラーが外観メソッドを受け取らないという問題を再現できる唯一の方法は、コンテナー ビュー コントローラーが次のことを行う場合です (これはあなたが行っていないと確信しています)。

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return NO;
}

おそらく、これを明示的に有効にすることができます:

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return YES;
}

しかし、私の子View Controllerは間違いなくviewWillAppear呼び出しを取得しています(明示的にautomaticallyForwardAppearanceAndRotationMethodsToChildViewControllers、またはこれを完全に省略した場合.

アップデート:

元の質問の下のコメントを見ると、問題は、問題の子コントローラー (B) 自体が、別の子コントローラー (C) を提示するコンテナー ビュー コントローラー (これは完全に受け入れられます) であることです。そして、このコントローラー B 自身の子コントローラー C が削除されているのに、コンテナー コントローラー B のviewWillAppearorを取得していない理由が気になります。コンテナー コントローラーは、子が削除されたときに (または、より正確には、コンテナー子が自分自身を削除するのではなく、子を削除する必要があります。コンテナが子を削除する場合、外観メソッドは受け取りません)。viewDidAppear

状況を誤解している場合は、お知らせください。

于 2012-07-18T04:02:30.367 に答える
1

同じ問題がありました 私のコンテナView Controllerはretainを介し​​て子View Controllerを実行しましたproperty、子View Controllerをその に追加しませんでした。childViewControllers array

私の解決策は、コンテナView Controllerにこのコード行を追加することでした

[self addChildViewController: childViewController];

その後、UIKit期待どおりに外観メソッドを子View Controllerに転送し始めました

また、プロパティ属性strongweak単に美しさのためにから に変更しました

于 2016-02-16T16:38:30.893 に答える
0

私の問題は、UITabBarController (selectedIndex = x) のタブを変更してから、そのタブの子ビュー コントローラーをいじっていたことです。問題は、逆の方法で行う必要があることです。最初に他のタブで子ビュー コントローラーをいじってから、selectedIndex を設定してタブを変更します。この変更後、メソッド viewWillAppear/viewDidAppear が正しく呼び出されるようになりました。

于 2014-04-08T00:57:46.287 に答える
-10

presentModalViewController または segues または pushViewController を使用して View Controller を提示すると、問題が解決するはずです。

または、何らかの理由で組み込みメソッドなしでビューを表示したい場合は、独自のコードでこれらのメソッドを手動で呼び出す必要があります。このようなもの:

[self addChildViewController:controller];
BOOL animated = NO;
[controller viewWillAppear:animated];
[self.view insertSubview:controller.view atIndex:0];
[controller viewDidAppear:animated];
[controller didMoveToParentViewController:self];   
于 2012-07-18T00:53:43.507 に答える