2

我创建了一个新的“标签栏应用程序”项目,它给了我一个 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标题等属性?当我单击 Files Owner 时,Identity 选项卡显示“SecondViewController”,因此 Files Owner 肯定是一个UIViewController,但它似乎没有存档在 nib 中。实际上,该实例似乎是通过编程方式创建的,而 nib 似乎只归档视图。

令人困惑,因为 nib 文件的名称是 SecondViewController.xib。有人可以澄清吗?

4

3 回答 3

2

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

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

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

于 2012-10-08T16:30:37.250 回答
1

您只能查看/更改对象部分中的一些属性Object

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

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

于 2012-10-08T16:30:26.180 回答
1

实际上,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;
}
于 2012-10-08T16:31:16.577 回答