菜鸟教程小白 发表于 2022-12-12 21:36:13

ios - UIDocument 打开/关闭行为


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

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

<pre><code>NSArray *samplesContent = [ URLsForResourcesWithExtension:@&#34;doco&#34; subdirectory:@&#34;Samples&#34;];

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

    [doco openWithCompletionHandler:^(BOOL success) {
      if (success) {
            ;

            if (self.docos.count &gt;= samplesContent.count) {
                ;
            }
      } else DLog(@&#34;Failed to open %@&#34;, );
   }];
}
</code></pre>

<p>我看到的是这样的:</p>

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

<pre><code>int count = 0;

for (Doco *doco in self.docos) {
    if (doco.documentState == UIDocumentStateNormal) {
      ;
      count++;
    }
}

DLog(@&#34;Closed %i docs&#34;, count);
</code></pre> </li>
<li><p>当我再次打开 View 时,应该再次填充文档数组并重新填充 tableView,但没有任何反应。</p></li>
</ol>

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

<pre><code>[doco openWithCompletionHandler:^(BOOL success) {}
</code></pre>

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

<p>但我有点卡在这部分,任何帮助将不胜感激。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题已经确定,但我认为值得描述几个简单的解决方案,因为在应用程序包中包含示例文档并不少见。</p>
<h3><em>所以问题是示例文档在关闭时尝试保存更改,但在只读应用程序包中保存无法成功。</em></h3>
<p>我认为这里有两个主要的解决方案:</p>
<ol>
<li><p>将示例文档复制到 Documents 目录中,可以将其与任何其他文档一样处理并成功保存(如果您希望保存用户对示例文档的编辑,请使用此方法)。</p>
</li>
<li><p>防止文档尝试保存(对于只读示例文档)。</p>
</li>
</ol>
<p>所以这里有一些简单的例子......</p>
<hr/>
<h2>1。将示例文档复制到 Documents 目录中</h2>
<p>在第一次启动时(或者实际上每当您决定“刷新”示例文档时),使用 <code>NSFileManager</code> 将文件复制到位:</p>
<pre><code>- (void)refreshSampleDocuments
{
    NSArray *sampleFromURLs = [ URLsForResourcesWithExtension:@&#34;doc&#34; subdirectory:@&#34;Samples&#34;];

    for (NSURL *sampleFromURL in sampleFromURLs) {

      NSString *sampleFilename = ;
      NSURL *sampleToURL = [ URLByAppendingPathComponent:sampleFilename];

      // ...
      // Do some checks to make sure you won&#39;t write over any user documents!
      // ....

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

      if (!copySuccessful) {
            // Handle error...
      }
    }
}
</code></pre>
<hr/>
<h2>2。阻止示例文档尝试保存</h2>
<p>这种方法更简单(对于只读文档),并且比试图阻止文档中可能出现的更新更容易。</p>
<p><code>closeWithCompletionHandler:</code> 在 <code>UIDocument</code> 上被调用时,<code>autosaveWithCompletionHandler:</code> 被调用以确保文档文件在关闭前被保存。这反过来调用 <code>hasUnsavedChanges</code> 来决定是否需要保存。因此,如果 <code>hasUnsavedChanges</code> 返回 <code>NO</code>,那么 <em>any</em> 调用自动保存机制将不会导致写入任何更改。</p>
<p><em>(注:手动调用 <code>saveToURL:forSaveOperation:completionHandler:</code> 仍将强制保存,无论 <code>hasUnsavedChanges</code> 返回什么。)</em></p >
<p>所以在您的 <code>UIDocument</code> 子类中,如果文档是只读的,则覆盖 <code>hasUnsavedChanges</code> 以返回 <code>NO</code>。</p>
<pre><code>@interface MyDocument : UIDocument

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

@end


@implementation MyDocument

- (BOOL)hasUnsavedChanges
{
    return ? NO : ;
}

@end
</code></pre>
<hr/></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIDocument 打开/关闭行为,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/11184408/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/11184408/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIDocument 打开/关闭行为