【问题标题】:documentPicker delegate not called by UIDocumentPickerViewControllerUIDocumentPickerViewController 未调用 documentPicker 委托
【发布时间】:2019-05-03 00:45:07
【问题描述】:

我有以下ViewController,它实现了使用UIDocumentPickerViewController 将文件导入应用程序的功能:

class MyViewController: UIViewController {
 
  override func viewDidLoad() {
    super.viewDidLoad()
  }
  
  func importFromFiles(origin: UIViewController?) {
         
    let documentPicker = UIDocumentPickerViewController(documentTypes: [kUTTypeContent as String], in: .import)
    documentPicker.delegate = self
    documentPicker.allowsMultipleSelection = true
      
    origin?.present(documentPicker, animated: true, completion: nil)
    
  }
  
}

如您所见,importFromFiles 方法接收到一个ViewController,它只是活动的 VC。这个方法是从AppDelegate调用的。

目前,documentPicker 方法如下所示:

extension MyViewController: UIDocumentPickerDelegate {

  func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
    print("Files picked")
  }

}

选择器正确显示和关闭,但委托从未被调用,因此print 从未执行。

编辑 1

importFromFiles 方法的调用发生在AppDelegate 内部。更具体地说,它发生在为 SwiftTweaks 调整定义闭包时:

MyTweaks.importFromFiles.addClosure {
  let topViewController = visibleViewController(root: self.window?.rootViewController)
  let myVC: MyViewController = MyViewController()
  myVC.importFromFiles(origin: topViewController)
}

【问题讨论】:

  • 为什么要创建MyViewController 的新实例只是为了显示文档选择器?您不应该在视图控制器的现有可见实例上调用 importFromFiles 吗?

标签: ios swift delegates uidocumentpickerviewcontroller


【解决方案1】:

看来您需要保留原来的主要对象

let myVC: MyViewController = MyViewController()
myVC.importFromFiles(origin: topViewController)

在你在这里展示选择器的地方 MyViewController() 没有保留,所以让它成为一个实例变量,比如

var main = MyViewController()

main.importFromFiles(origin:self)

【讨论】:

  • 您在importFromFiles 中创建 var local 的位置?
  • 我尝试将两者都作为importFromFiles 中的局部变量作为MyViewController 中的类属性,结果相同
  • 我认为他不需要强烈保留documentPicker。视图层次结构应该强烈保留它,所以问题应该在其他地方
  • 问题按预期检查更新的答案,使其成为实例变量,您可以在其中使用它在AppDelegate
  • 是的,这行得通。对不起,伙计们,这里对 Swift 来说真的很陌生。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2014-03-18
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多