Uidocumentinteractioncontroller Открыть Меню Отмененный Обратный Вызов

в настоящее время я разрабатываю приложение специально для iOS7, которое использует uidocumentinteractioncontroller open в меню и нуждается в методе, который уведомляет меня, когда пользователь отменяет и не выбирает доступный вариант.

UIDocumentInteractionControllerDelegate предлагает:

- (void)documentInteractionControllerDidDismissOptionsMenu:(UIDocumentInteractionController *) controller

но это не указывает, нажал ли пользователь одну из доступных опций или отменить.

какие идеи?

4 ответов


Примечание: это больше не будет работать для iOS 8, только iOS7 и ранее

чтобы определить, отменил ли пользователь меню или выбрал опцию, необходимо использовать следующие методы делегирования:

1-

- (void)documentInteractionController:(UIDocumentInteractionController *)controller
           didEndSendingToApplication:(NSString *)application
{
    //get called only when the user selected an option and then the delegate method bellow get called
    // Set flag here _isOptionSelected = YES;
    _isOptionSelected = YES;
}

2-

- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller
{
    //called whether the user has selected option or not
    // check your flag here 
    if(_isOptionSelected == NO) {
        //the user has canceled the menu
     }
    _isOptionSelected = NO;
}

iOS 8

для iOS 8 и выше используйте этот метод вместо метода на Шаге 2:

- (void)documentInteractionController:(UIDocumentInteractionController *)controller
           didEndSendingToApplication:(NSString *)application

Это будет работать на iOS7 & & iOS8

BOOL didSelectOptionFromDocumentController = NO;//**set this to "NO" every time you present your documentInteractionController too

-(void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application {
    didSelectOptionFromDocumentController = YES;
}


-(void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller {
    if (didSelectOptionFromDocumentController == NO) {//user cancelled.

    }
}

это работает для iOS8 & iOS9 для сторонних приложений и системных приложений!

это не красиво, но это работает.

может ли кто-нибудь сказать мне, пройдет ли это обзор приложения? Не уверен, поскольку я имею в виду имя класса, которое не является общедоступным (_UIDocumentActivityViewController). Это Swift 2.2!

расширение NSObject для получения строки имени класса:

extension NSObject {
    var theClassName: String {
        return NSStringFromClass(self.dynamicType)
    }
}

ваш Viewcontroller, где вы вызываете UIDocumentInteractionController от:

var appOpened = false
var presentedVCMonitoringTimer: NSTimer!
var docController: UIDocumentInteractionController!

func openDocController() {
    docController = UIDocumentInteractionController(URL: yourURL!)
    docController.UTI = "your.UTI"
    docController.delegate = self
    docController.presentOptionsMenuFromRect(CGRectZero, inView: self.view, animated: true)

    // Check the class of the presentedViewController every 2 seconds
    presentedVCMonitoringTimer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: #selector(self.checkPresentedVC), userInfo: nil, repeats: true)
}

func checkPresentedVC() {
    if let navVC = UIApplication.sharedApplication().keyWindow?.rootViewController as? UINavigationController {
        print(navVC.presentedViewController?.theClassName)
        if navVC.presentedViewController != nil && (navVC.presentedViewController?.theClassName)! != "_UIDocumentActivityViewController" && (navVC.presentedViewController?.theClassName)! != self.theClassName {
            // A system App was chosen from the 'Open In' dialog
            // The presented ViewController is not the DocumentInteractionController (anymore) and it's not this viewcontroller anymore (could be for example the MFMailComposeViewController if the user chose the mail app)
            appOpened = true
            presentedVCMonitoringTimer?.invalidate()
            presentedVCMonitoringTimer = nil
        }
    }
}

func documentInteractionControllerDidDismissOptionsMenu(controller: UIDocumentInteractionController) {
    print("dismissedOptionsMenu")
    presentedVCMonitoringTimer?.invalidate()
    presentedVCMonitoringTimer = nil
    if appOpened {
        // Do your thing. The cancel button was not pressed
        appOpened = false
    }
    else {
        // Do your thing. The cancel button was pressed
    }
}

func documentInteractionController(controller: UIDocumentInteractionController, willBeginSendingToApplication application: String?) {
    // A third party app was chosen from the 'Open In' menu.
    appOpened = true
    presentedVCMonitoringTimer?.invalidate()
    presentedVCMonitoringTimer = nil
}

для Swift 4, Используйте этот:

 func documentInteractionControllerDidDismissOpenInMenu(_ controller: UIDocumentInteractionController) {

        // this function get called when users finish their work, 
        // either for sharing thing within the same app or exit to other app will do
 }

Я использую его, когда после того, как пользователи поделились изображением с Facebook и Instagram.