【问题标题】:Need help understanding UIViewController and UIWindow initialization [closed]需要帮助了解 UIViewController 和 UIWindow 初始化[关闭]
【发布时间】:2017-01-01 23:30:05
【问题描述】:

我想知道是否有人可以解释以下代码块,因为我不太明白。

self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
self.navigationController = [[ UINavigationController alloc ] initWithRootViewController:self.viewController ];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];

那么当你想展示一个新的 vc 时,你可以这样做:

OtherViewController *ovc = [[ OtherViewController alloc ] initWithNibName:@"OtherViewController" bundle:nil ];
[ self.navigationController pushViewController:ovc animated:YES ];

要返回执行此操作:

[ self.navigationController popViewControllerAnimated:YES ];

【问题讨论】:

  • 具体有什么不明白的地方?这是使用 XIB 文件而不是故事板的相当老式的代码,但对我来说似乎不言自明。
  • 前四行是做什么的?我知道最后三个是用于创建 navigationController 并在 viewControllers 之间导航。
  • 前四个是这些元素的构造函数/初始化代码以及赋值

标签: ios objective-c navigationcontroller


【解决方案1】:

导航控制器需要一个“根”视图控制器,它是它管理的视图控制器堆栈中的底部视图控制器。

#1 self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
#2 self.navigationController = [[ UINavigationController alloc ] initWithRootViewController:self.viewController ];
#3 self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
#4 [self.window makeKeyAndVisible];

第 1 行创建一个“RootViewController”类的视图控制器(必须是自定义视图控制器类)。它从同名的 nibfile 加载视图控制器的视图。这类似于使用 instantiateViewControllerWithIdentifier 从情节提要中加载视图控制器,不同之处在于您必须指定要创建的视图控制器的类以及要加载的 nibfile

第 2 行创建一个导航控制器,将新创建的“RootViewController”作为它的根视图控制器

第 3 行将导航控制器安装为应用程序窗口的根视图控制器。

第 4 行使应用窗口成为活动窗口。

【讨论】:

    【解决方案2】:

    用简单的话解释。 每个 iOS 应用程序至少有 1 个UIWindow,它总是需要一个UIViewController 对象来设置为根,这意味着设置为用户在屏幕上可见的应用程序的初始 ViewController。 而UINavigationController 是堆栈容器,它将 ViewControllers 推入其中,并且默认情况下,此摊位中的顶部 ViewController 仅对屏幕可见。但最初它需要一个UIViewControllerUIWindowUINavigationController's 根视图控制器中设置为根视图控制器,它们需要一个起点。两者的工作方式不同,例如 UIWindow 根视图控制器可以随时更改,但 UINavigationController 不允许我们更改根视图控制器。

    现在让我在你的代码中解释一下发生了什么。

    self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    //In Above Line you are loading a UIViewController from a Xib file name RootViewController.xib into viewController property
    self.navigationController = [[ UINavigationController alloc ] initWithRootViewController:self.viewController ];
    //In Above Line You are allocating a new navigation controller programatically with a root/initial view controller and you are passing your previously loaded view controller to be set as root view controller of this navigation.
    self.window.rootViewController = self.navigationController;
    //In Above Line You are assigning your navigationController to UIWindow object this means you want your view controllers to be managed in a stack so that if you push a view controller you can snap back easily with a single line of code.
    [ self.navigationController popViewControllerAnimated:YES ];
    //In This Line you are removing your Top view Controller from a navigation stack Like the Back button does in Setting>General to Setting in iPhone/iPad
    

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      相关资源
      最近更新 更多