我有一个现有的基于Objective-C文档的应用程序,我用新的UIDocumentBrowserViewController替换了我以前的文件管理器,一切正常 - 除了我绝对难以理解如何使用模板选择器创建新文档。根据WWDC 2017视频“在iOS 11中构建基于文档的优秀应用程序”,您应该这样做:
func documentBrowser(_ controller: UIDocumentBrowserViewController, didRequestDocumentCreationWithHandler importHandler: @escaping (URL?, UIDocumentBrowserViewController.ImportMode) -> Swift.Void)
{
presentTemplateChooser(completion: {templateURL, canceled) in
if let templateURL = templateURL
{
importHandler(templateURL, .copy)
}
else
{
importHandler(nil, .none)
}
}
对我来说有意义的是呈现模板选择器,但对我来说没有意义的是我在模板选择器上有一个“完成”和“取消”按钮;但我怎么知道用户何时点击模板选择器上的“完成”或“取消”并将其传递给委托功能?有人知道如何在(最好)Objective-C中取消它吗? (但是Swift也很好,只是试图了解这个过程是如何工作的)非常感谢。
答案 0 :(得分:1)
我知道你最好要求Objective-C,但这是Swift的选项模式的一个例子。如果你的presentTemplateChooser方法在没有templateURL的情况下调用它的完成闭包(即它是nil),那么解包templateURL将失败(如果让templateURL = templateURL将返回false)。
如果您想知道用户是否明确按下取消,您可以这样做:
像这样创建取消操作:
let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in
completion(nil, true)
}
您问题中的方法应为:
func documentBrowser(_ controller: UIDocumentBrowserViewController, didRequestDocumentCreationWithHandler importHandler: @escaping (URL?, UIDocumentBrowserViewController.ImportMode) -> Swift.Void)
{
presentTemplateChooser(completion: {templateURL, canceled) in
if canceled {
print("User canceled")
}
if let templateURL = templateURL
{
importHandler(templateURL, .copy)
}
else
{
importHandler(nil, .none)
}
}
你可以在Objective-C中完成所有这些工作。你只需要检查nil而不是为templateURL解包。 (即如果templateURL!= nil而不是templateURL = templateURL)。