2017-06-21 121 views
5

我一直在研究一个新的基于文档的应用程序,并对新的UIDocumentBrowserController感到非常高兴......试图为我自己的文档浏览器解决方案UI很棘手!遇到问题让UIDocumentBrowserController在基于文档的应用程序中打开文档

我在浏览器创建后打开文档时遇到了一些麻烦。

现在发生的情况是,当我选择在文档浏览器中创建新文档时,虽然会记录错误消息,但是文档已按预期创建并打开。但是,在文档关闭后,即使显示文档,我也无法立即重新打开文件,也无法在后续启动时重新打开文件。然而,这里一个奇怪的线索是,如果我在创建文档后停止运行应用程序,但不向其添加新信息(触发保存周期),并再次运行项目,则可以正确打开该文件。这使得我认为文件被保存的方式存在问题。 (注意:在这个阶段,我正在努力使本地非icloud实现工作,然后再继续进行icloud实现。)

以下是代码中任何时候出现错误消息的文档保存到磁盘(或者至少大部分时间!): 2017-06-20 13:21:58.254938-0500 Sermon Design 2 iOS [22454:5000138] [默认] [错误]无法获取项目的属性值文件:///用户/ stevenhovater /库/开发商/ CoreSimulator /设备/ 9A4364F2-B3A1-4AD9-B680-FB4BC876C707 /数据/集装箱/数据/应用/ DD534ED8-C4A3-40FE-9777-AED961976878 /文档/无题 - 9 。讲道。错误:错误域= NSFileProviderInternalErrorDomain代码= 1“读者不被允许访问该URL。” UserInfo = {NSLocalizedDescription =读者不允许访问该URL}

我怀疑问题在于我的文档类型plists中的某些问题,我试图通过模拟wwdc视频中的设置来设置问题2017会话229.

enter image description here 我的文档由NSData对象封装,使用我认为是UIDocument的一个相当标准的子类实现。 (我省略了代码来生成缩略图)

override func contents(forType typeName: String) throws -> Any { 

    print("Saving Document Changes") 
    if sermon != nil { 
     let newData = NSKeyedArchiver.archivedData(withRootObject: sermon!) 

     return newData 
    } else { 
     let newData = NSKeyedArchiver.archivedData(withRootObject: Sermon()) 

     return newData  
    } 
} 

override func fileAttributesToWrite(to url: URL, for saveOperation: UIDocumentSaveOperation) throws -> [AnyHashable : Any] { 

    let thumbnail:UIImage = self.createThumbnail()  

    let thumbnaildict = [URLThumbnailDictionaryItem.NSThumbnail1024x1024SizeKey : thumbnail] 
    let dict = [URLResourceKey.thumbnailDictionaryKey:thumbnaildict] 
    return dict   
} 

override func load(fromContents contents: Any, ofType typeName: String?) throws { 

    guard let newSermon:Sermon = NSKeyedUnarchiver.unarchiveObject(with: contents as! Data) as? Sermon else{ 
     throw documentErrors.invalidFile 
    } 

    self.sermon = newSermon 

} 

在我UIDocumentBrowserViewController的子类,这里是我得到一个本地文件名和创建新的文件代码。

​​
+0

你有没有设法解决它? :/ –

+0

这是否有错误报告? – olynoise

+0

我已经提交了一个错误报告。 #35033364 – olynoise

回答

3

经过四五个小时的工作,我的头撞到这个问题,我发现了一个简单的解决方案:不要在模拟器中测试。我切换到在我的设备上进行测试,并立即开始按照广告进行工作。

[我不能在这里讲述经验,但可能是“在模拟器中不起作用”问题仅限于塞拉利昂,但模拟器确实在高塞拉利昂工作。这可以解释为什么有些用户看到这个问题,而另一些用户看不到这个问题,尤其是为什么苹果在WWDC视频中似乎没有意识到这一点。]

+0

出于好奇,你运行的是什么版本的OSX?当我在Mac上去高塞拉利昂时,这个问题一直没有解决。 –

+0

@StevenHovater很高兴收到您的消息 - 我正在使用Sierra,并且我也基于在开发人员论坛上所说的模拟器问题可能局限于Sierra的结论得出结论。所以谢谢你的确认。我会在我的答案中加上这一点,但我不能从经验中发言,我会这样说。我想知道整个事情是否真的与APFS有关?显然塞拉利昂将缺乏这一点。 – matt

+0

谢谢你在这个问题上让我从头撞到四五个小时! – XML

1

当我试图保存到NSTemporaryDirectory()时,我遇到了完全相同的问题。

如果您改为保存到文档目录([[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject]),它似乎工作正常!

更新:它看起来像是在iOS 11 beta 3中修复了这个问题,您现在可以正确保存新创建的文档到NSTemporaryDirectory()

+1

它在iOS11 beta 3中仍然不适用于我。我还使用了一个文件包,因此可能与它有关。 – olynoise

0

这是我目前的理论。

此错误

Error Domain=NSFileProviderInternalErrorDomain Code=1 "The reader is not permitted to access the URL." 

显示了先建立在使用-initWithFileURL新网址UIDocument时。它基本上是说“这个URL还没有存在”,但它的方式听起来更像是一个权限问题。

据我所知,它并不妨碍您保存,打开,编辑或关闭文件。所以我认为这只是苹果应该拿出来的一个多余的错误。

0

我发现错误发生在模拟器上时LSSupportsOpeningDocumentsInPlace属性设置为YES info.plist。 将此属性设置为NO,然后开始工作,在我的情况下。 在真实的设备上,它无论如何都可以正常工作而不会出错。

相关问题