【问题标题】:Why can't I edit the properties of UIViewController in Interface Builder when it's the File's Owner?当它是文件的所有者时,为什么我不能在 Interface Builder 中编辑 UIViewController 的属性?
【发布时间】:2012-09-28 22:18:58
【问题描述】:

我创建了一个新的“Tab Bar 应用”项目,它为我提供了 FirstViewController.xib 和 SecondViewController.xib。

AppDelegate 中,标签栏控制器的配置如下:

UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
self.window.rootViewController = self.tabBarController;

这显然会从 nib 文件中加载 UIViewController 的实例,不是吗?但是当我打开 SecondViewController.xib 时,我看到的唯一根级对象是视图控制器的视图。这对我来说没有意义,因为我相信整个UIViewController 实例实际上是从那个笔尖出来的。

剩下的在哪里?为什么我看不到标题等UIViewController 属性?当我单击文件所有者时,身份选项卡显示“SecondViewController”,因此文件所有者肯定是UIViewController,但它似乎没有存档在笔尖中。实际上,该实例似乎是通过编程方式创建的,而 nib 似乎只归档视图。

因为 nib 文件的名称是 SecondViewController.xib,所以很容易混淆。有人可以澄清一下吗?

【问题讨论】:

    标签: iphone ios xcode xcode4 interface-builder


    【解决方案1】:

    当一个对象是“nib 文件所有者”时,这意味着它在加载 nib 之前已经被实例化(不一定是“初始化”)。当您加载笔尖时,它不会创建所有者,它只是将插座连接到所有者。

    我同意,您不能使用 IB 中的“属性”面板为通过 initWithNibName 初始化的视图控制器上的属性设置初始值,这令人困惑。

    但是,我相信您可以通过文件所有者的 IB 中的用户定义的运行时属性面板设置文件所有者的属性值(仅限 XCode 4.2+,iOS5+)。

    【讨论】:

      【解决方案2】:

      实际上,SecondViewController 的实例来自 SecondViewController.h。当您使用 initWithNibName:@"SecondViewController" 时,它会加载 nib 及其属性,但如果您想更改任何这些对象,您需要使用界面生成器将它们连接到 SecondViewController。

      重现您的问题,我可以获得具有以下视图的 SecondViewController.xib:

      查看 标签 - 第二个视图 文本视图

      如果您查看 SecondViewController.m,您可以看到它在方法中更改了标题

      - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
      {
          self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
          if (self) {
              self.title = NSLocalizedString(@"Second", @"Second");
              self.tabBarItem.image = [UIImage imageNamed:@"second"];
          }
          return self;
      }
      

      【讨论】:

        【解决方案3】:

        您只能查看/更改 部分Object 的属性,这些属性位于对象部分中。

        通常,对象部分中的对象设置为 IBoutlet 到文件所有者(在您的情况下为 UIViewController),如果您将 UIViewController 拖动到对象部分,您也可以对其进行编辑,但同时谈论文件所有者,您可以设置它的变量/属性/方法,并且只能设置那些变量/属性/方法是IBOutletsIBAction

        如果你想设置它的标题等,你必须通过代码手动完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-22
          • 2014-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多