I have the following ViewController that implements functionality for importing files into the app using the 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)
}
}
As you can see, the importFromFiles method receives a ViewController, which is simply the active VC. This method is called from the AppDelegate.
For now, the documentPicker method looks just as follows:
extension MyViewController: UIDocumentPickerDelegate {
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
print("Files picked")
}
}
The picker is displayed and dismissed correctly, but the delegate is never called and therefore the print never executed.
The call to the importFromFiles method is happening inside the AppDelegate. More specifically, it happens while defining a closure for a SwiftTweaks tweak:
MyTweaks.importFromFiles.addClosure {
let topViewController = visibleViewController(root: self.window?.rootViewController)
let myVC: MyViewController = MyViewController()
myVC.importFromFiles(origin: topViewController)
}
It appears you need to retain the main object as you have
let myVC: MyViewController = MyViewController()
myVC.importFromFiles(origin: topViewController)
inside where you present that picker here MyViewController() isn't retained so make it an instance var like
var main = MyViewController()
main.importFromFiles(origin:self)