访问UIWindow的rootViewController?

时间:2012-04-12 23:59:56

标签: iphone objective-c ios

以下是ECSlidingViewController演示代码的applicationDidFinishLaunching方法:

- (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;

我只是不知道你怎么能抓住窗口的根视图控制器,并按照你喜欢的方式投射它?这条线到底是做什么的,它是如何工作的?

1 个答案:

答案 0 :(得分:4)

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

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