簡體   English   中英

setRootViewController:在setViewControllers:被調用后無法按預期工作

[英]setRootViewController: doesn't work as expected after setViewControllers: have been called

我以編程方式創建了一個視圖控制器,並將其設置為根控制器。 一切都按預期完成了:

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的“ View Controller編程指南”之后,我仍然不明白我在哪里錯了。

setRootViewController:方法應該自動將參數視圖控制器的_view分配為窗口的默認視圖,但是如果命名的視圖控制器先前已經由UITabBarViewController的viewControllers屬性指向,則不會發生。 盡管我檢查了調試器,發現調用setViewControllers:方法后'vc'對象沒有更改。

您能給我解釋一下發生了什么嗎,還是請我指出我應該閱讀的文檔?

更新:我不會將'vc'控制器插入到'tbc'控制器中。 我想要的是全屏顯示“ vc”視圖,就像通常不用“ tbc”代碼顯示的那樣。 從我的角度來看,添加另一個視圖(在我的情況下為tbc)不應影響此行為。

當然,從實際的角度來看,這是毫無用處的,但是我想知道引擎蓋下發生了什么。

您應該將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;

將vc添加到選項卡欄控制器時,它將成為該控制器的子級。 窗口的根視圖控制器不能為子級,這就是為什么會出現該錯誤的原因。 如果要使vc為全屏顯示,則不要將其放在選項卡欄控制器中,然后在某個時候將窗口的根視圖控制器切換為選項卡欄控制器(如果您要這樣做的話)。

您尚未說出要使用vc的功能。 一種更好的方法(取決於其用法)可能是從選項卡欄控制器的第一個選項卡中的任意一個控制器中模態顯示(這樣就占據了整個屏幕)。 從viewDidAppear執行此操作,這將是用戶在應用啟動時首先看到的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM