2013-12-24 6 views
8

親ビューコントローラに子ビューコントローラを追加しようとしていますが、子ビューコントローラが通常のコールバックをトリガしていないことを除いて、すべてが正常に機能します。例えば、viewWillAppear(animated)のようなものは決して呼び出されません。私はそれを調べ、それが親にそれぞれ追加する前と後に子ビューコントローラでwillMoveToParentViewControllerとdidMoveToParentViewControllerを呼び出さなかったためだと考えました。残念ながら、それを修正しても差はありません。誰も私はこれを行うことができますので、私はaddChildViewControllerとremoveChildViewController通常のコールバックがトリガされるように知っていますか? childViewControllerを追加した後、親ビューコントローラのビューにそのビューをサブビューとして追加します。どちらのポイント(addChildViewController & addSubview)で、などのメソッドが呼び出されます、子ビューコントローラのviewWillAppear(アニメーション)ん...iOSルーティングviewDid子ビューコントローラに表示されますか?

ニック

+0

addChildViewControllerの操作方法についていくつかのコードを投稿できますか? – johnMa

+0

これらのコールバックが機能するはずです。子供の追加方法を示す必要があります。 – rdelmar

答えて

4

ちょうどしようとしたが、親のViewControllerでのviewDidLoadで次の手順を実行し、動作しているようです

ChildExperimentViewController *child = [[ChildExperimentViewController alloc]init]; 
[self addChildViewController:child]; 
[self.view addSubview:child.view]; 
[child didMoveToParentViewController:self]; 
-4

することはできマニュアルコールparectViewController内の子ビューコントローラのviewWillAppear、この

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [selectedViewController viewWillAppear:animated]; 
} 
ようなコード

あなたはあなたがtabBarControllerのデリゲートで、このようなコードを追加することができますchildViewControllerとしてtabBarController、スーパービューを追加している場合、あなたがnavigationControllerのデリゲート

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    [viewController viewWillAppear:animated]; 
} 

にこのようなコードを追加することができますchildViewControllerとしてnavigationControllerを追加している場合

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.tabBarController.selectedViewController viewWillAppear:animated]; 
} 

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 
    [viewController viewWillAppear:NO]; 
} 

これがあなたの問題を解決できるかどうかわかりませんが、あなたを助けることができれば幸いです。

+1

私たちはviewWillAppearや他のメソッドを手動で呼び出すべきではありません。https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/beginAppearanceTransition:anim : – vivek

10

viewWillAppear、あなたがビュー階層からあなたViewControlerビューを削除するときに自動的に呼び出さviewDidDisappear viewWillDisappear、ビュー階層

にごViewControlerビューを追加するときに自動的に呼び出されるviewDIdAppear

メインビューコントローラを表示する前にサブコントローラビューを追加しているため、メインビューが表示されないため、このメソッドが呼び出されないことがありますrchy自体?

メインビューコントローラーが表示されたり消えたりしたら、対応するメソッドの子に対してこのメ​​ソッドを呼び出す必要があります。

6

これがあなたの状況に当てはまるのかどうかは不明ですが、あなたの子供にアピアランスコールバックメソッドを手動で送信することを試してみてください。

Appleのビューコントローラ封じ込めdocumentationから:

しかし、時々、デフォルトの動作では、あなたのコンテナの意味がありません ために、これらのイベントを送信することができます。たとえば、 複数の子どもが同時にビューステートを変更している場合、 は、外観コールバック がより論理的な順序で同時に発生するように、変更を統合することができます。これを行うには、 コンテナクラスを変更して、外観 またはローテーションコールバックを引き継ぐようにします。

それはあなたがよりきめの細かい制御をしたい場合は、手動で自分の子供には、外観のコールバックを転送してお勧めします。

// From the container view controller 
- (BOOL) shouldAutomaticallyForwardAppearanceMethods 
{ 
    return NO; 
} 

-(void) viewWillAppear:(BOOL)animated 
{ 
    [self.child beginAppearanceTransition: YES animated: animated]; 
} 

-(void) viewDidAppear:(BOOL)animated 
{ 
    [self.child endAppearanceTransition]; 
} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [self.child beginAppearanceTransition: NO animated: animated]; 
} 

-(void) viewDidDisappear:(BOOL)animated 
{ 
    [self.child endAppearanceTransition]; 
} 
6

この1試してください:あなたのビューコントローラ

に追加した後

childController.willMoveToParentViewController(self) 
childController.beginAppearanceTransition(true, animated: true) 

0
let vc = ChildVC.init() 
vc.frame = self.view.bounds 
self.addChildViewController(vc) 
self.view.addSubview(vc.view) 
vc.willMove(toParentViewController: self) 
vc.didMove(toParentViewController: self) 
0

スウィフトでChourobinanswer

override var shouldAutomaticallyForwardAppearanceMethods: Bool { 
    return false 
} 

override func viewWillAppear(_ animated: Bool) { 
    self.childViewControllers[self.segmentView.selectedSegmentIndex].beginAppearanceTransition(true, animated: animated) 
} 

override func viewDidAppear(_ animated: Bool) { 
    self.childViewControllers[self.segmentView.selectedSegmentIndex].endAppearanceTransition() 
} 

override func viewWillDisappear(_ animated: Bool) { 
    self.childViewControllers[self.segmentView.selectedSegmentIndex].beginAppearanceTransition(false, animated: animated) 
} 

override func viewDidDisappear(_ animated: Bool) { 
    self.childViewControllers[self.segmentView.selectedSegmentIndex].endAppearanceTransition() 
} 

P.S.子VCへの参照をプロパティまたは変数として保持していないためです。現在選択されているセグメントインデックスを使用してアクセスすることをお勧めします。 SegmentViewはサードパーティUISegmentControlです。

関連する問題