UIDocumentPickerViewController - 未调用委托方法

Posted

技术标签:

【中文标题】UIDocumentPickerViewController - 未调用委托方法【英文标题】:UIDocumentPickerViewController - Delegate method not being called 【发布时间】:2018-08-15 06:56:57 【问题描述】:

我正在使用 UIDocumentPickerViewController 从文件中选择文档并将其上传到服务器。我能够成功访问文件,但是单击文件后,不会调用委托方法。

我使用以下代码调用文档选择器:

class Uploads: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    @IBAction func uploadDocument(_ sender: Any) 

        let documentPicker = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF), String(kUTTypePlainText)], in: .import)
        documentPicker.delegate = self
        if #available(ios 11.0, *) 
            documentPicker.allowsMultipleSelection = false
         else 
        
        present(documentPicker, animated: true, completion: nil)
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    
    */



extension Uploads: UIDocumentPickerDelegate 

    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) 

        print(urls.first)
    

    func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) 
        print("Cancelled")
    

我注意到调用委托方法时收到以下警告:

实例方法 'documentPicker(:didPickDocumentsAt:)' 几乎匹配 可选要求 'documentPicker(:didPickDocumentsAt:)' 的 协议'UIDocumentPickerDelegate'

将 'documentPicker(_:didPickDocumentsAt:)' 设为私有以使其静音 警告

我相信由于这个警告而没有调用委托方法,但我不知道为什么会收到这个警告。

【问题讨论】:

您使用的是哪个 swift 版本?问题中的代码对我来说适用于 Swift 3。 我也在使用 Swift 3。如果我在新项目中使用相同的代码,它可以正常工作。但不知何故,它在我正在从事的这个特定项目中不起作用。 您可以尝试添加具有正确名称的覆盖关键字或@objc 属性吗?我想知道编译器是否能够自动推断它... @ThomasDeniau 这也不起作用 @AkshayYerneni - 关于这个!我遇到了类似的问题...委托方法 didPickDocumentsAt 根本没有被调用,尽管取消的回调正在工作。谢谢!! 【参考方案1】:

分享代码示例,希望对您有所帮助:

class ViewController : UIViewController,UIDocumentPickerDelegate

  var documentBrowser: UIDocumentPickerViewController = 
  let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
  let browser = UIDocumentPickerViewController(documentTypes: [documentsPath], in: .open)
      browser.allowsMultipleSelection = true
      return browser
    ()

override func viewDidLoad() 
        super.viewDidLoad()
        self.addChild(documentBrowser)
        documentBrowser.view.frame = self.view.bounds
        view.addSubview(documentBrowser.view)
 

  func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL])
       print(urls)
   

【讨论】:

【参考方案2】:

如果将采用 'UIDocumentPickerDelegate' 协议的类声明为 'open',则会出现问题。

例如这个类有问题:

open class FilePickerHelper: UIDocumentPickerDelegate

虽然这个类不会有问题:

class FilePickerHelper: UIDocumentPickerDelegate

【讨论】:

以上是关于UIDocumentPickerViewController - 未调用委托方法的主要内容,如果未能解决你的问题,请参考以下文章