QIOSFileDialog/QIOSDocumentPickerController - handle dismissed view controller

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ø <tor.arne.vestbo@qt.io>
This commit is contained in:
Timur Pocheptsov 2022-03-04 14:29:27 +01:00
parent bf6d313ec8
commit bb30beb726
2 changed files with 18 additions and 1 deletions

View File

@ -41,6 +41,8 @@
#include "qiosfiledialog.h"
@interface QIOSDocumentPickerController : UIDocumentPickerViewController <UIDocumentPickerDelegate, UINavigationControllerDelegate>
@interface QIOSDocumentPickerController : UIDocumentPickerViewController <UIDocumentPickerDelegate,
UINavigationControllerDelegate,
UIAdaptivePresentationControllerDelegate>
- (instancetype)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog;
@end

View File

@ -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