【问题标题】:Code Pattern: Loading TabBarController objects directly from independent .xib file (instead of from MainWindow.xib)代码模式:直接从独立的 .xib 文件(而不是从 MainWindow.xib)加载 TabBarController 对象
【发布时间】:2010-11-05 01:02:39
【问题描述】:

我在网上找了一圈,没能找到一个可以接受的解决这个问题的方法……

我正在寻找一个简单的代码模式:

从单独的 .xib 文件中加载 TabBarController 对象(带有关联的子视图控制器),而不是从默认的 MainWindow.xib 中包含并自动加载。

在 XCode 术语中,从一个新的 iPad/iPhone 项目作为“Tab Bar Application”开始,目标是解决以下问题:

  • 创建项目
  • 从 MainWindow.xib 中移动:TabBarController、TabBar、FirstViewController 和 SelectedSecondViewController 到新的“TabBarController.xib”文件中
  • 移动后,MainWindow.xib 应该只包含:文件的所有者、第一响应者、应用代理、窗口
  • 在 TabBarController.xib 中,文件的所有者和第一响应者分别设置为:UIApplication 和 UIResponder。
  • 将主应用程序委托中的“didFinishLaunchingWithOptions”更改为以下内容:

删除:

[self.window addSubview:tabBarController.view];

添加:

UITabBarController *uiTab = [[UITabBarController alloc] initWithNibName:@"TabBarController" bundle:nil]; [self.window addSubview:uiTab.view];

通过这些更改,应用程序构建并运行,但是当 TabBarController 加载时,标签栏是“空的”——控制器中似乎没有任何内容。

在调试器中查看时,“init”没有从数据中正确初始化,或者 .xib 文件中的某些内容设置不正确。

解决这个问题的正确方法是什么?我意识到还有其他方法可以做到这一点,是的,我让它们在其他应用程序中工作。

然而,我正在寻找的是,是使用默认项目的特定解决方案,可用作设置 iOS 代码的一般模式。

提前感谢您的帮助

  • js

【问题讨论】:

    标签: xcode design-patterns ios xib tabbarcontroller


    【解决方案1】:

    我想我知道你在寻找什么,因为我想要同样的东西。

    1. 在界面生成器中创建新的空 xib 文件。
    2. 从库中添加到 xib TabBarController
    3. 在 xib 上的此选项卡栏控制器上编辑您需要的任何内容。
    4. 当然,保存...

    确定要从哪个视图控制器创建带有标签栏控制器的 xib。换句话说,谁是会导致这个标签栏控制器出现的视图控制器。 我们称那个视图控制器为ParentViewController

    在该视图控制器中,创建一个IBOutlet 到一个TabBarController

    回到xib,将文件所有者的身份设置为ParentViewController,当然不要忘记将文件所有者中的标签栏控制器的出口连接到xib中的标签栏控制器。 保存 xib,您就可以开始了。

    当您想要显示该选项卡栏时,只需决定您要采用哪种方式:模态、弹出或其他方式(不在导航控制器内,因为 Apple 不允许选项卡栏控制器在导航控制器内)。

    当您决定时,只需以呈现任何其他视图控制器的方式呈现您的标签栏控制器出口。例如:

    [self presentModalViewController:self.myTabBarController animated:YES];
    

    【讨论】:

      【解决方案2】:

      假设您从“标签栏应用程序”模板开始,并将 UITabBarController 和关联的视图控制器移动到您描述的新笔尖...

      在您的新笔尖中,文件的所有者应设置为您的 AppDelegate 类。然后将File's Owner的出口“tabBarController”连接到UITabBarController。

      然后在您的 -[application:didFinishLaunchingWithOptions:] 中,不要删除此行:

      [self.window addSubview:tabBarController.view];
      

      相反,在此之前加载新的 nib,并将您的应用委托作为所有者:

      [[NSBundle mainBundle] loadNibNamed:@"TabBarController" owner:self options:nil];
      

      这将设置您的 tabBarController 属性(因为您在 nib 中建立了该连接),然后您可以正常进行。你所做的实际上是创建一个全新的 UITabBarController,而不是从笔尖加载一个。 (好吧,好吧,你只是加载了一小会儿,然后没有做任何有用的事情)

      希望对您有所帮助。

      【讨论】:

      • 这不是他想要的。他希望能够从应用程序中的任何位置的 xib 文件加载选项卡栏控制器。例如 - 在弹出控制器中。
      猜你喜欢
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2016-08-31
      • 2011-01-11
      • 1970-01-01
      相关资源
      最近更新 更多