2012-07-29 49 views
2

我幾乎要瘋了:的ViewController addSubview

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] init]; 
[self.view addSubview:golOlur.view]; 

我上面的代碼,我稱這種現象的一個IBACtion裏面ViewController。大家都可以猜到,GolOlurActionViewControllerViewController

當過程開始時,將調用golOlur的viewDidLoadviewDidAppear方法,但不顯示視圖。

我已經嘗試了我所知道的一切,但無法解決這個問題。

+3

等等,我誤解你的代碼。你爲什麼試圖添加另一個視圖控制器的視圖作爲這個子視圖?這不是ViewControllers的工作方式。你創建一個視圖控制器來控制視圖。它應該被推動成爲使用時的默認控制器。如果你只需要創建一個'golOlur'視圖來添加到你當前的視圖,你就需要子類'UIView' - 而不是'UIViewController'。 – WendiKidd 2012-07-29 15:52:12

+0

另外,當IBAction方法結束時,您遇到問題。如果你使用的是ARC,你的'GolOlurActionViewController'將被髮布,如果你與你從中獲取的視圖進行交互,會導致崩潰。如果它不是ARC,那就是內存泄漏。 – 2012-07-29 16:13:16

+0

@iremk我同意Wendi的觀點,即使用'addSubview'(這是非常流行的)過渡到新視圖的概念,代表了視圖控制器與視圖的角色的根本混淆。 _不要使用'addSubview'在視圖控制器的主視圖之間切換!_ – Rob 2012-07-29 16:33:23

回答

9

如果您的意圖是在視圖之間轉換,那麼您確實不應該使用addSubview。如果這樣做,您將不會收到輪換事件,因爲您允許視圖控制器層次結構與視圖層次結構不同步。您只應使用addSubview才能在視圖中添加真實的子視圖(例如,UILabelUIImageViewUIButton等,或者,如果對視圖進行適當的控制器控制等子視圖)。視圖之間轉換使用addSubview表示視圖控制器和視圖之間的基本混淆。

正確管理視圖的關鍵是確保視圖控制器層次結構與視圖層次結構同步。最簡單的方法是在視圖控制器之間進行轉換,並讓它們處理視圖的表示。因此,如果你使用的發鈔銀行,它一般會是:

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] initWithNibName:nil bundle:nil]; 
[self presentViewController:golOlur animated:YES completion:nil]; 

或者,發鈔銀行與導航控制器:

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] initWithNibName:nil bundle:nil]; 
[self.navigationController pushViewController:golOlur animated:YES]; 

或者,如果你使用故事板(話又說回來,如果你是用故事板,你可能會使用塞格斯,也不會需要任何這一點,但只是爲了完整起見):

GolOlurActionViewController *golOlur = [self.storyboard instantiateViewControllerWithIdentifier:@"GolOlurActionView"]; 
[self presentViewController:golOlur animated:YES completion:nil]; 

,如果你的故事板使用導航控制器:

GolOlurActionViewController *golOlur = [self.storyboard instantiateViewControllerWithIdentifier:@"GolOlurActionView"]; 
[self.navigationController pushViewController:pushViewController:golOlur animated:YES]; 

在你試圖做控制器遏制萬一,讓我們知道,因爲這是略有不同(無需對addChildViewControllerdidMoveToParentViewController通話),但如果你正在做的視圖之間的基本轉變,正確您的控制器的初始化和隨後撥打presentViewControllerpushViewController應該爲您做。

更新:

作爲一個快速之外,如果使用的是故事板(我不認爲你是,但以防萬一),而不是instantiateViewControllerWithIdentifier,我可能真的建議你定義一個SEGUE在情節串連圖板,以在Interface Builder的標識字符串中提供它,然後使用下面的代碼過渡到下一個場景:

[self performSegueWithIdentifier:@"yourIdentifier" sender:self]; 

如果你做這種方式,它需要實例化控制器爲你的護理並且您的整個應用程序的流程將在stor中準確表示yboard。

2

我相信你的問題是你期望的故事板或視圖。當你以你的方式創建一個UIViewController時xib會顯示出來,這是行不通的。您需要在故事板中連接一個push segue(需要一個UINavigationController),或者以模態方式呈現新的控制器,您也可以在故事板中進行操作。如果你有一個這個ViewController的筆尖,你可以這樣做:

CustomViewController *controller = [[CustomViewController alloc] initWithNibName:@"CustomViewController.xib" bundle:[NSBundle mainBundle]]; 

[self presentViewController:controller animated:YES completion:NULL];