2011-10-12 242 views
0

公平地說,定義爲MainWindow.xib的一部分的Controller是應用程序的根控制器?rootViewController澄清需要

此外,假設RootController始終是負責向用戶顯示什麼視圖的人員,這是否屬實?

+1

並不總是如此。我偶爾會將一個rootviewcontroller設置爲navigationController。在項目設置中,您可以指定啓動時首先加載的Xib。但除此之外,是的,rootviewcontroller可以佈局子視圖並彈出給其他人,但是當試圖決定向用戶呈現什麼視圖時,導航控制器纔是真正的優勢。 – CodaFi

+0

請以「答覆」 – JAM

回答

4

這恰好出現在一些基於標準IB窗口的項目中,但最終需要一個窗口和一個視圖來向用戶顯示某些內容。

就認爲:

考慮這一點。我創建了一個空項目,添加一個視圖(只是MyView.xib),添加一個按鈕到這個和這個代碼。沒有根控制器 - 只是窗口和視圖。

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

    UINib *nib = [UINib nibWithNibName:@"MyView" bundle:nil]; 
    UIView *myView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 

    [[self window] addSubview:myView]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

對於基於一個典型的窗口:

的-info.plist點的MainWindow.xib(主要筆尖文件基本名稱),文件所有者指向應用程序的委託,應用程序委託的的viewController指向一個UIViewController。然後,通常,將窗口rootviewController設置爲上面設置的viewController。

- (BOOL)application:(UIApplication *)application didFinis hLaunchingWithOptions: (NSDictionary *)launchOptions 
{ 

    self.window.rootViewController = self.viewController; 

但是,如果你看這個導航基於應用程序(MasterDetail項目),沒有MainWindow.xib文件。

main.m指向appDelegate。

應用程序的委託創建一個navigationController和navigationController主控制器,這是編程創建成爲rootViewContoller

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 

    MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease]; 
    self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease]; 
    self.window.rootViewController = self.navigationController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

最後,在此方案示例中的窗口RootViewController的甚至沒有設置。
導航控制器的視圖直接添加到窗口。在一天結束時,窗戶只是託管一個視圖。您可以設置它或者根控制器可以控制它。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // create window since nib is not. 
    CGRect windowBounds = [[UIScreen mainScreen] applicationFrame]; 
    windowBounds.origin.y = 0.0; 
    [self setWindow:[[UIWindow alloc] initWithFrame:windowBounds]]; 

    // create the rootViewController 
    _mainViewController = [[MainViewController alloc] init]; 

    // create the navigationController by init with root view controller 
    _navigationController = [[UINavigationController alloc] initWithRootViewController:_mainViewController]; 

    // in this case, the navigation controller is the main view in the window 
    [[self window] addSubview:[_navigationController view]]; 

    [self.window makeKeyAndVisible]; 
    return YES; 
}