0
之間共享的UIView

比方說,在UIButtonViewControllerA水龍頭下面過渡到ViewControllerB之前發生:如何轉變UIViewController的(與addChildUsingController :)

- (IBAction)levelSelectButton:(id)sender { 
    ViewControllerB* obj = [[ViewControllerB alloc] init]; 
    [self addChildViewController:obj]; 
    CGSize screenSize = [MainScreen screen]; 
    CGFloat screenWidth = screenSize.width; 
    CGFloat screenHeight = screenSize.height; 
    obj.view.frame = CGRectMake(0,0,screenWidth,screenHeight); 
    [obj.view addSubview:_banner]; 

    //[obj didMoveToParentViewController:self]; 
    [self runPushAnimationWithController:obj]; 
} 

ViewControllerB顯示出來,我可以看到我_banner(一個GADBannerView對象)的視圖,但是當我回到ViewControllerA時,它不再存在。

我從來沒有使用addChildViewController:/didMoveToParentViewController:方法之前,所以我不知道這是否有望做,但我希望能夠回到ViewControllerA_banner仍清晰可見。

我需要保留它嗎?

+0

你想要做什麼按鈕點擊事件? 就像在你自己的視圖控制器裏面打開另一個視圖控制器一樣?或者你只是想推動視圖控制器與一些自定義過渡動畫? –

回答

0

一個視圖只能屬於一個超級視圖。引用Apple的文檔:

視圖只能有一個超級視圖。如果視圖已經有超級視圖並且該視圖不是接收者,則在使接收者成爲新的超級視圖之前,該方法移除先前的超級視圖。

因此,當您將視圖添加到新創建的父視圖控制器時,它將從當前視圖控制器的視圖層次結構中移除。

我會建議不要這樣做。只需在兩個地方創建視圖的副本。如果它使用大量數據,則在視圖控制器之間共享數據(模型),但不共享視圖對象。

如果您完全設置爲在視圖控制器之間移動視圖,我會將屬性添加到新視圖控制器並設置該屬性而不是操縱其他視圖控制器的視圖層次結構。當您返回當前視圖控制器時,您還必須將視圖傳回。

您應該將視圖控制器的視圖層次視爲私有。不這樣做違反了封裝原則。

+0

謝謝鄧肯,這對我有很大的幫助,並且你說服我放棄了兩個控制器之間的整個親子關係(反過來,我也擁有了所有其他控制器)。 –

+0

親子關係可能非常有用,但我認爲你沒有正確使用它。看看容器視圖並嵌入賽段。 –

+0

這就是我以爲我在做什麼,或者至少應用正確。我不處理Storyboard或Xib文件,所以我正在以編程方式做所有事情。總的來說,我想要的是在兩個控制器之間嵌入segue,其中'_banner'是容器視圖(文章[link] https://spin.atomicobject.com/2015/07/21/ios-container-views /總結) –