2013-01-23 38 views
1

我以編程方式創建了視圖控制器並將其設置爲根控制器。所有因爲預期的工作完美:setRootViewController:在setViewControllers之後無法按預期工作:已調用

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
CustomViewController *vc = [[CustomViewController alloc] init]; 
[[self window] setRootViewController:vc];  
self.window.backgroundColor = [UIColor whiteColor]; 
[self.window makeKeyAndVisible]; 
return YES; 

然後我添加了一個UITabBarViewController,設置它的「viewControllers」屬性指向(數組)主要的viewController「VC」。

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
CustomViewController *vc = [[CustomViewController alloc] init]; 

UITabBarController *tbc = [[UITabBarController alloc] init]; 
NSArray *controllers = @[vc]; 
[tbc setViewControllers:controllers]; 

[[self window] setRootViewController:vc];  
self.window.backgroundColor = [UIColor whiteColor]; 
[self.window makeKeyAndVisible]; 
return YES; 

和視圖採空,在啓動時,屏幕顯示,也有警告有關根視圖控制器沒有設置。在'vc'控制器的視圖下面添加字符串後,終於加載了,但屏幕底部有一個空行,就好像UIBarController修改了[[UIMainScreen bounds]一樣。

[[self window] addSubview:vc.view]; 

我是新來的iOS開發,我有點困惑。看起來我並不理解關於視圖控制器層次結構的一些非常基本的東西,但在閱讀Apple的「視圖控制器編程指南」後,我仍然不明白我的錯在哪裏。

setRootViewController:方法應該自動將參數視圖控制器的_view作爲窗口的默認視圖分配,但如果命名的視圖控制器先前已由UITabBarViewController的viewControllers屬性指向,則不會發生此情況。雖然我檢查了調試器,發現調用setViewControllers:方法後'vc'對象沒有改變。

您能解釋一下發生了什麼,或者指向我應該閱讀的文檔嗎?

更新:我不打算將'vc'控制器插入'tbc'控制器。我想要的是全屏顯示「vc」視圖,因爲它通常會顯示沒有關於「tbc」的代碼。 從我的角度來看,添加另一個視圖(在我的情況下是tbc)不應該影響這種行爲。

當然,從實用的角度來看,這沒什麼用處,但我想知道底下會發生什麼。

回答

0

您應該將tbc設置爲rootViewController

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
CustomViewController *vc = [[CustomViewController alloc] init]; 

UITabBarController *tbc = [[UITabBarController alloc] init]; 
NSArray *controllers = @[vc]; 
[tbc setViewControllers:controllers]; 

[[self window] setRootViewController:tbc]; 
[[self window] addSubview:tbc.view]; 
self.window.backgroundColor = [UIColor whiteColor]; 
[self.window makeKeyAndVisible]; 
return YES; 
+0

我已更新該問題。困擾我的是稍微不同的東西。 –

0

當您將vc添加到標籤欄控制器時,它將成爲該控制器的子項。窗口的根視圖控制器不能是一個孩子,這就是爲什麼你會得到這個錯誤。如果你希望vc是全屏,那麼不要把它放在標籤欄控制器中,然後在某個時候,你將窗口的根視圖控制器切換爲標籤欄控制器(如果這是你想要的)。

你還沒有說過你想用vc來做什麼。根據其用途,更好的方法可能是從控制器的第一個選項卡中選擇哪一個控制器以模態方式顯示它(因此需要整個屏幕)。從viewDidAppear這樣做,這將是用戶在應用程序啓動時看到的第一件事。