tmyam's blog

time run off...

Mac App,创建基于文档的app

简介

基于文档的app在mac下又是比较常见的形式,但是介绍的文章比较少。为了避免少走弯路,在此进行一些简单的介绍。

创建

创建一个mac app,在下图这个界面,勾选Create Document-Based Application
temp

其中继承自NSDocumentDocument就是文档类,区别于AppDelegateDocument不是单例,而是对应一个个文档实例。

自建文档文件图标

这里省略,格式为icns…

关联文件类型

  • 导入文档图标(上步创建的图标)
  • 在工程的Info里进行设置,如下图。
    temp
    Document Types设置文档关联的文件,Identifier为文档标示。
    Exported UTIs为具体的文档设置,Identifier必须和Document Types的一致,这里面可以设置图标,扩展名等等。
    注意图标必须设置在Document Types里面,运行之后就会立即生效。
    而且这两项都是可以设置多个关联的,关联多个文档类,关联多种格式。

运行

这时,运行工程,文件关联就已经完成了。可以创建一个指定的扩展名文件,看看是不是已经变成了指定的图标样式。如果没有改变,可以重启电脑之后看看。

编码

Document.m文件里已经有两个函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
    if ([typeName isEqualToString:@"com.tmyam.TestDocument.document"])
    {
        // TODO: 这里是具体的存储文件数据
        return [@"test" dataUsingEncoding:4];
    }
    else
    {
        if (outError)
        {
            *outError = [NSError errorWithDomain:@"TestDocumentErrorDomain"
                                            code:-1
                                        userInfo:@{NSLocalizedFailureReasonErrorKey:[NSString stringWithFormat:@"Unsupported data type: %@", typeName]}];
        }
    }
    return nil;
}

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
    assert([typeName isEqualToString:@"com.tmyam.TestDocument.document"]);

    // TODO: 这里是具体的读取文件数据

    return YES;
}

示例

TestDocument示例下载

评论