首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NSDocumentController 4中使用XCode子类?

如何在NSDocumentController 4中使用XCode子类?
EN

Stack Overflow用户
提问于 2011-09-10 17:38:52
回答 9查看 7.6K关注 0票数 14

我目前正在努力教自己可可的发展。为此,我为Mac购买了一本非常优秀的书Cocoa : Vermont,这本书贯穿了创建一个示例应用程序的过程。它很好,但是它是针对XCode 3.2而不是XCode 4编写的。到目前为止,我已经能够自己来连接它,但是我遇到了一个问题,在这个问题上,我不知道如何遵循指令。

本质上,本书通过子类NSDocumentController的示例案例,以便应用程序能够处理两种不同类型的文档(最终可能是任意数目),从而为每种类型打开适当的窗口。因此,我已经创建了一个自定义的NSDocumentController子类(书中称之为VRDocumentController),现在我需要使它能够在应用程序启动过程中加载该控制器的一个实例。基本上,这个类是一个单例,所以我必须在应用程序实例化标准类之前实例化我的类,这必须在进程的早期完成。当然可以。

书中引用了用于子类NSDocumentController的Apple,其中指出有两种方法可以解决这个问题:在MainMenu.xib文件中实例化类或在-applicationWillFinishLaunching:委托方法中实例化类。苹果的文档并没有给出如何做到这两种方法的明确说明(稍后会有更多的介绍),而且这本书只涵盖了第一个版本,我认为这可能是我最喜欢的方法。

我的问题是:我无法在XCode 4中完成这个任务。这本书为XCode 3.2提供的说明已经不准确了,因为界面生成器已经被洗牌到XCode本身,新版本的“类”选项卡不再显示我的项目的类。我发现关于堆栈溢出的问题问了一个类似的问题,所以我试着在那里遵循公认的答案。但是,当我打开身份检查器并尝试键入VRDocumentController时,它只会对我发出嗡嗡声,而不接受它。我编写的其他控制器类似乎都不是可接受的输入。

我也很乐意选择另一条路线:在-applicationWillFinishLaunching方法中实例化一个副本。但是,我根本不知道该方法实际上属于哪一类,也不知道它的返回类型是什么。我也做了大量的搜索,没有运气。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-09-10 18:57:28

在您的应用程序委托中:

代码语言:javascript
复制
// LukeAppDelegate.h
#import "LukeAppDelegate.h"
#import "VRDocumentController"

- (void)applicationWillFinishLaunching:(NSNotification *)notification {
    VRDocumentController *dc = [[VRDocumentController alloc] init];
}

这将确保VRDocumentController的实例被创建并注册为共享文档控制器,从而防止Cocoa使用默认的NSDocumentController

至于为什么无法在nib文件中使用自定义对象,请确保在将新对象拖到nib文件中时,要选择对象(蓝色多维数据集)而不是对象控制器(绿色球体内的蓝色多维数据集)。

编辑:--如果您的目标是支持恢复的OS版本,-applicationWillFinishLaunching:注册自定义文档控制器可能为时已晚。如果应用程序委托被放置在MainMenu.xib中,则应该在恢复任何文档之前由nib加载过程实例化它,因此可以将NSDocumentController子类初始化移动到应用程序委托的init方法:

代码语言:javascript
复制
// LukeAppDelegate.h
#import "LukeAppDelegate.h"
#import "VRDocumentController"

- (id)init {
    self = [super init];
    VRDocumentController *dc = [[VRDocumentController alloc] init];
    return self;
}
票数 15
EN

Stack Overflow用户

发布于 2013-08-30 11:15:25

标记为“正确”的答案(@ applicationWillFinishLaunching: )无法在基于文档的应用程序上工作,因为文档通常在调用任何之前加载。在阅读了@Graham Perks答案中的有用线索之后,我尝试了几种不同的方法,这似乎是可靠的:

代码语言:javascript
复制
@implementation AppDelegate

- (id)init
{
    self = [super init];
    if (self) {
        MyDocumentController *dc = [[MyDocumentController alloc] init];
        if (dc) {};
    }
    return self;
}

Note显然(如果还没有创建),您需要首先自己创建一个AppDelegate,并将其链接到您的MainMenu.XIB中。

票数 7
EN

Stack Overflow用户

发布于 2016-02-01 09:25:24

及时创建自定义文档控制器的更容易的方法是实现+ (void) load方法:

--这就是实现自定义文档控制器所需的全部工作。

代码语言:javascript
复制
@implementation AppDocumentController

+ (void) load
{
    [AppDocumentController new];
}

// ... your overriding goes here

@end

这是很酷的,因为没有分离的科德斯。不能100%确定控制器是否创建得太早,但对我来说效果很好。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7373446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档