【问题标题】:iPhone "View-based application" template: how is the view controller xib loaded?iPhone“基于视图的应用程序”模板:视图控制器xib是如何加载的?
【发布时间】:2011-04-24 19:44:22
【问题描述】:

我的 Cocoa 有点生疏了,我有一个简单的问题。当我在 XCode 4 中创建“基于视图的应用程序”时,我得到了一个主窗口 xib、一个应用程序委托以及一个 UIViewController 子类和 xib。主窗口 xib 包含 UIViewController 子类作为对象。但是我在代码或检查器中的任何地方都没有看到这个 UIViewController 上的“init”调用。这个视图控制器是如何初始化的?我猜一个嵌入式对象的“init()”只是神奇地被调用了?

【问题讨论】:

    标签: iphone cocoa-touch uiviewcontroller


    【解决方案1】:

    请看when exactly do Interface Builder items get instantiated?,我提供了一个描述笔尖加载过程的答案。

    【讨论】:

    • 哦,UIViewController awakeFromNib 会加载视图控制器的 nib 吗?
    • viewController在MainWindow.nib中,实际上是由plist中的一个entry加载的。
    • 是的,我知道 viewController 对象来自哪里。它是如何加载它的 viewController XIB 的呢?
    • 全部连接在 MainWindow.xib 中。查看 File's Owner 委托,它引用了 First Responder 下面的 XXXAppDelegate。 appDelegate 将其 viewController 设置为 xib 中的视图控制器。选择视图控制器并打开检查器,它引用了另一个 nib 文件。
    • hrm 好的。所以它是“NIB 名称”属性。我想我只是有点困惑,并以传统的“做 x 然后 y”的方式思考事物,而不是声明性/预先构建的 XIB 观点。因此,如果我想使用相同的视图控制器加载不同的 NIB,我可以更改“NIB 名称”属性值。谢谢!
    【解决方案2】:

    self.window.rootViewController = self.viewController;

    它们通过 MainWindow.xib 文件连接

    如果您想在从 xib/nib 加载视图控制器时自定义内容,则需要覆盖视图控制器中的 - (id)initWithCoder:(NSCoder *)inCoder 方法

    示例:

    - (id)initWithCoder:(NSCoder *)theCoder {
    
        self = [super initWithCoder:theCoder];
    
        if(self) {
    
            // your fancy stuff here!
        }
    
        return self;
    }
    

    【讨论】:

    • 我问的是怎么加载的,而不是怎么连接的
    • 看到我回答的第一行了吗? viewcontroller 定义为windowrootViewController。当您调用 [self.window makeKeyAndVisible]; 时,rootViewController (self.viewController) 将被加载。
    • “将被加载”到底是什么意思?
    • 如果这是您的问题,将调用 - (id)initWithCoder:(NSCoder *)inCoder;
    • 好的。抱歉这些愚蠢的问题,我只是很难重新思考可可范式。当我将一个对象(例如视图控制器)冻干到 XIB 中时,该对象是如何在冻结到 XIB 之前“创建”的?如果我想使用与“init()”不同的“init”消息来初始化对象,比如“initSpecial(X x)”,该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多