iOS 11 - UIDocumentBrowserViewController使用Template Chooser创建新文档,如何设置?

时间:2017-08-23 18:38:20

标签: ios ios11

我有一个现有的基于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也很好,只是试图了解这个过程是如何工作的)非常感谢。

1 个答案:

答案 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)。