From bb30beb72642bf7c33f502f81e0dc7f4951ba8ec Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 4 Mar 2022 14:29:27 +0100 Subject: [PATCH] QIOSFileDialog/QIOSDocumentPickerController - handle dismissed view controller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When we use a native view controller for selecting documents, we have two methods to implement from UIDocumentPickerDelegate (a file was selected or the selection was cancelled). Unfortunately, swiping a view away was not handled, so neither 'accept' nor 'reject' was called. Depending on the classes using QIOSFileDialog, this may leave them in some incorrect state, not knowing that they are 'closed' anyway. As suggested by Tor Arne, the solution is to implement UIAdaptivePresentationControllerDelegate's method, namely -presentationControllerDidDismiss:, which never gets called if the controller was dismissed programatically (the case of accept/reject). Pick-to: 6.3 6.2 5.15 Fixes: QTBUG-93505 Change-Id: I28404aa280465ef8eb0f5c26c8c2e4e4a6c66641 Reviewed-by: Tor Arne Vestbø --- .../platforms/ios/qiosdocumentpickercontroller.h | 4 +++- .../platforms/ios/qiosdocumentpickercontroller.mm | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/ios/qiosdocumentpickercontroller.h b/src/plugins/platforms/ios/qiosdocumentpickercontroller.h index dba6f24fc58..2fe3c9e3820 100644 --- a/src/plugins/platforms/ios/qiosdocumentpickercontroller.h +++ b/src/plugins/platforms/ios/qiosdocumentpickercontroller.h @@ -41,6 +41,8 @@ #include "qiosfiledialog.h" -@interface QIOSDocumentPickerController : UIDocumentPickerViewController +@interface QIOSDocumentPickerController : UIDocumentPickerViewController - (instancetype)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog; @end diff --git a/src/plugins/platforms/ios/qiosdocumentpickercontroller.mm b/src/plugins/platforms/ios/qiosdocumentpickercontroller.mm index 476480c488c..fcf5e104bda 100644 --- a/src/plugins/platforms/ios/qiosdocumentpickercontroller.mm +++ b/src/plugins/platforms/ios/qiosdocumentpickercontroller.mm @@ -72,6 +72,7 @@ m_fileDialog = fileDialog; self.modalPresentationStyle = UIModalPresentationFormSheet; self.delegate = self; + self.presentationController.delegate = self; if (m_fileDialog->options()->fileMode() == QFileDialogOptions::ExistingFiles) self.allowsMultipleSelection = YES; @@ -100,4 +101,18 @@ emit m_fileDialog->reject(); } +- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController +{ + Q_UNUSED(presentationController); + + // "Called on the delegate when the user has taken action to dismiss the + // presentation successfully, after all animations are finished. + // This is not called if the presentation is dismissed programatically." + + // So if document picker's view was dismissed, for example by swiping it away, + // we got this method called. But not if the dialog was cancelled or a file + // was selected. + emit m_fileDialog->reject(); +} + @end