2011-04-30 45 views
9

通過這個問題,我想知道我是否理解了根視圖控制器的概念。編程iOS:關於根視圖控制器的說明

在iOS應用程序中,根視圖控制器(RVC)是其視圖在啓動時被添加到UIWindow應用程序的控制器,是不是真的?

[window addSubview:rvcController.View]; 
[window makeKeyAndVisible]; 

現在,一個UIWindow也有一個rootViewController屬性。當運行前面的代碼片段時,該屬性是否被rvcController填充,還是必須顯式設置?

然後,在UINavigationController中,可以設置與之前爲入口點設置的RVC不同的RVC。

在這種情況下,我第一次一個控制器添加到navigationController堆棧(推一個新的控制器),該框架是否設置控制器爲RVC的navigationController或做我必須通過initWithRootViewController顯式設置方法?

回答

20

雅..當我開始iPhone開發.. rootViewController的東西扔了我一個循環了。但它非常簡單。

當應用程序啓動時,我在我的應用程序委託類中創建了一個UIWindow對象。另外,在那個類中,我有一個名爲window的UIWindow類型的屬性;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    UIWindow *w = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 
    self.window=w; 
    [w release]; 
    // other code here... 
} 

我然後創建一個UIViewController,其view將在窗口層次結構中的第一個觀點,這可以被稱爲「根視圖控制器」。

令人困惑的部分是......經常我們創建一個UINavigationController爲「根視圖控制器」,並且導航控制器具有要求一個「RootViewController的」,這是第一個的ViewController它將把它的堆棧上的init方法。

因此,窗口獲得一個「根視圖控制器」,它是UINavigationController,它也有一個RootViewController,它是您要顯示的第一個視圖控制器。

一旦你那種出來,其都有道理。我想:-)

這裏是一些代碼,做這一切..

(從一個項目,我必須在我面前打開拍攝)
//called with the app first loads and runs.. does not fire on restarts while that app was in memory 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  


    //create the base window.. an ios thing 
    UIWindow *w = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 
    self.window=w; 
    [w release]; 

    // this is the home page from the user's perspective 
    //the UINavController wraps around the MainViewController, or better said, the MainViewController is the root view controller 
    MainViewController *vc = [[MainViewController alloc]init]; 

    UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:vc]; 
    self.navigationController=nc; // I have a property on the app delegate that references the root view controller, which is my navigation controller. 

    [nc release]; 
    [vc release]; 

    //show them 
    [self.window addSubview:nc.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 
+0

但是這並沒有設置window.rootViewController,是嗎? – nmr 2012-08-09 15:41:55

+0

的「相對較新的」屬性window.rootViewController(如4.0)不將其添加到窗口層次結構並保持到windows根視圖控制器的引用。 – 2012-08-10 01:50:30

+0

對,所以我沒有看到它被設置,VC正在通過'[self.window addSubview:nc.view];'添加,所以這個例子會讓它不被設置,對吧? – nmr 2012-08-10 15:10:39

8

現在,一個UIWindow也有一個rootViewController屬性。當運行前面的代碼片段時,該屬性是否被rvcController填充,還是必須將其設置爲「明確」?

你必須明確地設置它,如果你這樣做,你可以刪除addSubview線,因爲當你設置一個根視圖控制器會自動處理。

然後,在UINavigationController中,可以設置與之前爲入口點設置的RVC不同的RVC。

當然,導航控制器的根視圖控制器無關與窗口。

在這種情況下,我第一次一個控制器添加到navigationController堆棧(推一個新的控制器),該框架是否設置控制器爲RVC的navigationController或做我必須明確地設置通過initWithRootViewController方法?

initWithRootViewController只是用於初始化一個空的導航控制器和推動第一(根)視圖控制器送到堆棧上的快捷方式。請注意,rootViewController不是UINavigationController的財產,您可以通過[navController.viewControllers objectAtIndex:0]訪問它。

+0

感謝您回覆omz。你是什​​麼意思與_You必須明確地設置它,如果你這樣做,你可以刪除addSubview線,因爲當你設置一個根視圖controller._是會自動處理? – 2011-04-30 14:12:59

+0

然後,你說'initWithRootViewController'是一個快捷方法。好!所以用這個方法創建一個navigationController或者創建一個新的並且在其上推控制器,它是一樣的,是不是真的?這兩個過程是否創建了我無法刪除的根視圖控制器? – 2011-04-30 14:15:16

+0

非常感謝您的合作!如果你添加一個子視圖到窗口 – 2011-04-30 14:15:42

0
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 

    ViewController *viewcontroller =[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil]; 

self.window.rootViewController= viewcontroller; 




[self.window makeKeyAndVisible]; 
return YES; 

}

1

首先你可以在Xcode中創建一個空的項目。在用xiv在objectivec類視圖控制器上添加新文件後。現在你可以在appdeligate添加到該代碼appdeligate.m 並設置RootViewController的

注: - ViewController.h進口到appdeligate.m

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 

    ViewController *viewcontroller =[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil]; 

self.window.rootViewController= viewcontroller; 




[self.window makeKeyAndVisible]; 
return YES; 

}