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 - 未调用委托方法的主要内容,如果未能解决你的问题,请参考以下文章