• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - UIDocument 打开/关闭行为

[复制链接]
菜鸟教程小白 发表于 2022-12-12 21:36:13 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个基于 UIDocument 的应用程序,但没有 iCloud 支持。用户可以创建文档,并将它们保存到应用的 Document 目录中。

我还创建了一些“示例”文档,并将它们与应用程序包一起传递。我希望用户能够像打开自己的文档一样打开示例文档:

NSArray *samplesContent = [[NSBundle mainBundle] URLsForResourcesWithExtension"doco" subdirectory"Samples"];

for (NSURL *sampleURL in samplesContent) {
    Doco *doco = [[Doco alloc] initWithFileURL:sampleURL];
    [doco disableEditing];

    [doco openWithCompletionHandler:^(BOOL success) {
        if (success) {
            [self.docos addObject:doco];

            if (self.docos.count >= samplesContent.count) {
                [self.tableView reloadData];
            }
        } else DLog(@"Failed to open %@", [sampleURL pathExtension]);
     }];
}

我看到的是这样的:

  1. viewDidLoad 上,docs 数组会填充示例文档,并在应用首次启动时显示在 tableView 中。这里没有问题,一切都很顺利和美好。
  2. 然后我使用以下代码退出 View 以关闭所有打开的文档:

    int count = 0;
    
    for (Doco *doco in self.docos) {
        if (doco.documentState == UIDocumentStateNormal) {
            [doco closeWithCompletionHandler:nil];
            count++;
        }
    }
    
    DLog(@"Closed %i docs", count);
    
  3. 当我再次打开 View 时,应该再次填充文档数组并重新填充 tableView,但没有任何反应。

下面的完成处理程序永远不会被调用,尽管 URL 指向同一个文件并且它是有效的:

[doco openWithCompletionHandler:^(BOOL success) {}

对于存储在 Documents 中的用户生成的文档,我没有这个问题,所以我的假设是它与自动保存有关,它在只读包上被调用并失败

但我有点卡在这部分,任何帮助将不胜感激。



Best Answer-推荐答案


问题已经确定,但我认为值得描述几个简单的解决方案,因为在应用程序包中包含示例文档并不少见。

所以问题是示例文档在关闭时尝试保存更改,但在只读应用程序包中保存无法成功。

我认为这里有两个主要的解决方案:

  1. 将示例文档复制到 Documents 目录中,可以将其与任何其他文档一样处理并成功保存(如果您希望保存用户对示例文档的编辑,请使用此方法)。

  2. 防止文档尝试保存(对于只读示例文档)。

所以这里有一些简单的例子......


1。将示例文档复制到 Documents 目录中

在第一次启动时(或者实际上每当您决定“刷新”示例文档时),使用 NSFileManager 将文件复制到位:

- (void)refreshSampleDocuments
{
    NSArray *sampleFromURLs = [[NSBundle mainBundle] URLsForResourcesWithExtension"doc" subdirectory"Samples"];

    for (NSURL *sampleFromURL in sampleFromURLs) {

        NSString *sampleFilename = [sampleFromURL lastPathComponent];
        NSURL *sampleToURL = [[self documentsDirectoryURL] URLByAppendingPathComponent:sampleFilename];

        // ...
        // Do some checks to make sure you won't write over any user documents!
        // ....

        NSError *error;
        BOOL copySuccessful = [[NSFileManager defaultManager] copyItemAtURL:sampleFromURL toURL:sampleToURL error:&error];

        if (!copySuccessful) {
            // Handle error...
        }
    }
}

2。阻止示例文档尝试保存

这种方法更简单(对于只读文档),并且比试图阻止文档中可能出现的更新更容易。

closeWithCompletionHandler:UIDocument 上被调用时,autosaveWithCompletionHandler: 被调用以确保文档文件在关闭前被保存。这反过来调用 hasUnsavedChanges 来决定是否需要保存。因此,如果 hasUnsavedChanges 返回 NO,那么 any 调用自动保存机制将不会导致写入任何更改。

(注:手动调用 saveToURL:forSaveOperation:completionHandler: 仍将强制保存,无论 hasUnsavedChanges 返回什么。)

所以在您的 UIDocument 子类中,如果文档是只读的,则覆盖 hasUnsavedChanges 以返回 NO

@interface MyDocument : UIDocument

@property(nonatomic, getter = isReadOnly) BOOL readOnly;

@end


@implementation MyDocument

- (BOOL)hasUnsavedChanges
{
    return [self isReadOnly] ? NO : [super hasUnsavedChanges];
}

@end

关于ios - UIDocument 打开/关闭行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11184408/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap