iphone - 访问 UIWindow 的 rootViewController?

标签 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;

我只是不明白你怎么能捕获窗口的 Root View Controller ,然后像你喜欢的那样转换它?那条线到底是做什么的,它是如何工作的?

最佳答案

在您的 Storyboard中,您为 Root View Controller 设置了一个场景(即,在属性中选中了 rootViewController 复选框,并且 Canvas 上的初始箭头指向该 View Controller )。该 View Controller 的类在属性检查器中设置。在您的情况下,类(class)设置为 ECSlidingViewController .这决定了 Storyboard将实例化的对象的类。

UIWindow 有一个属性 rootViewController返回该对象。 UIWindow 上的属性类型是UIViewController - 所以窗口知道它是一个 View Controller ,但它不知道比这更多的细节。您的 ECSlidingViewController类是 UIViewController 的子类.当它返回时,您的代码会将其转换为更具体的对象,以便您可以将其作为实际更具体的对象来使用。

关于iphone - 访问 UIWindow 的 rootViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133515/

相关文章:

ios - 通过 plist 的 TableView 部分

ios - UINavigationController.hidesBarsOnSwipe=YES 导致 NSInternalInconsistencyException

ios - 从另一种方法 iOS 更新 UITableViewCell 中的值

iphone - 我们可以将 UI 自动化工具与 iPhone 模拟器一起使用吗?

iphone - 运行应用程序现在崩溃的 xcode 清理和清理构建文件夹后如何运行应用程序

ios - 我想通过我的 BLE 设备连接到 iPhone 的 BLE

iphone - AFNetworking 与 iOS 4.3 不兼容

objective-c - objective-c ,动画 block ,动画和完成之间的延迟

ios - 如何在加载后返回 UIImage

ios - PodFile 未安装指定版本