gpt4 book ai didi

cocoa - 将基本 Cocoa 应用程序转换为基于文档的应用程序

转载 作者:行者123 更新时间:2023-12-03 16:03:15 24 4
gpt4 key购买 nike

我和我的团队一直在开发一个现有的、非基于文档的 Cocoa 应用程序。这是我们的第一个 Cocoa 应用程序,尽管到目前为止我们已经开发了许多 iOS 应用程序。

不过,该应用程序确实应该是基于文档的,因此我已经开始尝试对其进行转换。但这里和那里的事情似乎不起作用。例如,"file"->“打开”菜单项被永久禁用(尽管我最终启用了"file"->“保存”菜单项;最初它不会)。此外,我可以单击红色 X 来关闭窗口,尽管"file"->“关闭”菜单项本身已被禁用;但是,当我通过 X 按钮关闭窗口时,不会调用 NSDocument 实现 (SPDocumentInfo) 中的 dealloc 方法。我创建了一个示例,全新的基于文档的应用程序只是为了进行比较;当我关闭那里的窗口时,确实会调用 SPDocument 实现的 dealloc 方法(正如我所期望的那样)。所以这让我担心。

我对项目做了很多修改;它们包括:

  • 使 SPDocumentInfo 扩展 SPDocument,就像在 .h 文件中一样:

    @interface SPDocumentInfo : NSDocument <NSWindowDelegate>
  • 在 SPDocumentInfo 中实现了以下内容:

    - (NSString *)windowNibName {
    return @"SPDocument";
    }

    - (void)windowControllerDidLoadNib:(NSWindowController *) aController {
    [super windowControllerDidLoadNib:aController];
    }

    - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
    NSString *xml = [self toXml];
    return [xml dataUsingEncoding:NSUTF8StringEncoding];
    }

    - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError {
    // will make this work later
    if ( outError != NULL ) {
    *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];
    }
    return YES;
    }
  • 编辑 .plist 文件以添加“文档类型”。其中,定义了“Cocoa NSDocument Class”=“SPDocumentInfo”。

  • 更改了 SPDocumentInfo 中的一些连接,以匹配基于文档的示例应用程序中的连接。例如,在 SPDocument.nib 中,文件的所有者(代表 SPDocumentInfo)是窗口的委托(delegate)。

所以,我想知道在转换为基于文档的应用程序时是否可能缺少其他类型的东西。或者,有关于如何执行此操作的任何指南吗? (我看过但找不到)。或者我应该从一个新的基于文档的应用程序开始,并尝试将我们所有的东西改造成它?一般来说,有人有这方面的经验吗?

最佳答案

一个常见的建议是创建一个基于文档的新应用程序并将所有现有代码移至其中。对于一个拥有各种配置良好的大型工作空间来说,这可能会很麻烦。更不用说破坏版本控制了。

我采取了以下简单的步骤并且有效:

  • 生成基于文档的应用程序
  • 从此生成的项目中,从 Info.plist 复制以下部分(使用普通文本编辑器打开文件):

    <key>CFBundleDocumentTypes</key>
    <array>
    <dict>
    <key>CFBundleTypeExtensions</key>
    <array>
    <string>mydoc</string>
    </array>
    <key>CFBundleTypeIconFile</key>
    <string></string>
    <key>CFBundleTypeName</key>
    <string>DocumentType</string>
    <key>CFBundleTypeOSTypes</key>
    <array>
    <string>????</string>
    </array>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>NSDocumentClass</key>
    <string>$(PRODUCT_MODULE_NAME).Document</string>
    </dict>
    </array>

    并将其粘贴到您自己项目的 Info.plist 文件中。

  • 将 Document.swift 从生成的基于文档的项目复制到您自己的项目中。

  • 它包含一个方法:

    override func makeWindowControllers() {
    // Returns the Storyboard that contains your Document window.
    let storyboard = NSStoryboard(name: "Main", bundle: nil)
    let windowController = storyboard.instantiateController(withIdentifier: "Document Window Controller") as! NSWindowController
    self.addWindowController(windowController)
    }

    它会按照您通常应用程序的方式创建一个新窗口。如果 Storyboard只有一个窗口 Controller ,则“withIDentifier”字段可以包含任意内容。如果 Storyboard中有更多窗口 Controller ,则标识符需要与新文档的正确窗口 Controller 相对应。

关于cocoa - 将基本 Cocoa 应用程序转换为基于文档的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5097758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com