2013-12-24 59 views
8

我添加一個子視圖控制器到父視圖控制器,並且一切都按預期工作,除了子視圖控制器沒有觸發其通常的回調。例如viewWillAppear(動畫)等東西永遠不會被調用。我看着它,並認爲這可能是因爲我沒有分別將它添加到父級之前和之後調用子視圖控制器上的willMoveToParentViewController和didMoveToParentViewController。不幸的是,修復並沒有什麼區別。有誰知道我怎麼可以連線這個,所以當我做addChildViewController和removeChildViewController常規回調觸發?在添加childViewController之後,我還將其視圖作爲子視圖添加到父視圖控制器的視圖中。在沒有點(addChildViewController & addSubview)做子視圖控制器的viewWillAppear中(動畫)等方法被調用......iOS路由viewDidAppear到子視圖控制器?

尼克

+0

你可以發佈一些關於你如何做addChildViewController的代碼嗎? – johnMa

+0

那些回電應該工作。你需要展示你如何添加孩子。 – rdelmar

回答

4

只是試圖做的在viewDidLoad中父視圖 - 控制下,它似乎工作

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

可以在手動調用子視圖控制器的viewWillAppear中的parectViewController,這樣

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [selectedViewController viewWillAppear:animated]; 
} 
代碼

,如果您有添加一個navigationController作爲childViewController你可以像這樣的navigationController的委託

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

,如果你有添加tabBarController作爲childViewController你可以在tabBarController的委託這樣的代碼添加和超視圖中添加代碼

- (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:animated : – vivek

10

viewWillAppear中viewDIdAppear自動調用,當你將你的ViewControler視圖視圖層次

viewWillDisappearviewDidDisappear當您從一個視圖層次刪除您ViewControler視圖自動調用

也許這種方法沒有被調用,因爲在顯示主視圖控制器之前添加子控制器視圖,因此您的主視圖不在視圖中rchy本身?

當你的主視圖控制器出現或消失時,你應該在相應的方法中調用childs的這個方法。

6

不確定這是否適用於您的情況,但嘗試嘗試手動將外觀回調方法發送給您的孩子。

從蘋果公司的視圖控制器遏制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

試試這個:添加到您的視圖控制器後

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() 
} 

附:因爲我並沒有把兒童風險投資作爲一種財產或變量。我更喜歡使用當前選擇的段索引訪問它。 SegmentView是第三方UISegmentControl