2012-04-12 55 views
1

下面是ECSlidingViewController演示代码的applicationDidFinishLaunching方法:访问UIWindow的rootViewController?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    ECSlidingViewController *slidingViewController = (ECSlidingViewController *)self.window.rootViewController; 
    UIStoryboard *storyboard; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
    storyboard = [UIStoryboard storyboardWithName:@"iPhone" bundle:nil]; 
    } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    storyboard = [UIStoryboard storyboardWithName:@"iPad" bundle:nil]; 
    } 

    slidingViewController.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"FirstTop"]; 

    return YES; 
} 

什么没有意义,我是第一个行:

ECSlidingViewController *slidingViewController = (ECSlidingViewController*)self.window.rootViewController; 

我只是不明白你如何抢窗口的根视图控制器,并且像你那样强制转换它?这条线究竟做了什么,它是如何工作的?

回答

4

在故事板你有一个场景设置为根视图控制器(即,RootViewController的复选框中的属性检查,并且在画布上的初始箭头在这个视图控制器指向)。该视图控制器的类在属性检查器中设置。在你的情况下,课程设置为ECSlidingViewController。这决定了故事板将实例化的对象的类。

的UIWindow有一个返回该对象的属性rootViewController。类型上的UIWindow的属性是UIViewController - 这样的窗口都知道它是一个视图控制器,但它不知道任何比这更多的细节。您的ECSlidingViewController类是UIViewController的一个子类。当它返回时,你的代码将它转换为一个更具体的对象,这样你就可以将它作为它实际上更具体的对象来使用。

相关问题