在iPad上呈现View Controller只允许.Popover

时间:2016-11-15 00:31:00

标签: ios swift ipad ios10 presentviewcontroller

我有一个我试图普及的iPhone应用程序。我有这段代码:

let documentMenu = UIDocumentMenuViewController(documentTypes: [kUTTypeContent as String], inMode: .Import)
documentMenu.modalPresentationStyle = .FormSheet
documentMenu.delegate = self
self.presentationContext.presentViewController(documentMenu, animated: true, completion: nil)

self.presentationContext只是一个传递给该类的视图控制器。

每次执行此代码时,都会发生此错误:

  

您的应用程序提供了一个UIDocumentMenuViewController()。在其当前的特征环境中,具有此样式的UIDocumentMenuViewController的modalPresentationStyle是UIModalPresentationPopover。您必须通过视图控制器的popoverPresentationController为此弹出窗口提供位置信息。您必须提供sourceView和sourceRect或barButtonItem。如果在呈现视图控制器时未知此信息,则可以在UIPopoverPresentationControllerDelegate方法-prepareForPopoverPresentation中提供该信息。

我不确定是怎么回事。我甚至试图设置sourceViewsourceRect来阻止错误,然而,它将DocumentMenuViewController粘贴到一个弹出框中,我不是那样的。我需要在屏幕中央以模态方式呈现。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

问题在于,UIDocumentMenuViewController并不希望显示为除了较小的" popover"之外的任何内容。演示风格。它自己的实现会覆盖其modalPresentationStyle.Popover的任何设置。因此,您最终会忽略将样式设置为.FormSheet的尝试。

这是导致错误的原因。样式为.Popover后,您必须执行错误说明并设置sourceViewsourceRectbarButtonItem的适当组合。

向Apple提交增强请求,以支持其他模式演示样式。在此期间,您需要调整UI。

答案 1 :(得分:0)

let documentMenu = UIDocumentMenuViewController(documentTypes: [kUTTypeContent as String], inMode: .Import)
documentMenu.popoverPresentationController?.sourceView = self // UIView 
documentMenu.modalPresentationStyle = .popover
documentMenu.delegate = self
self.presentationContext.presentViewController(documentMenu, animated: true, completion: nil)

答案 2 :(得分:0)

以下代码运行正常

let importMenu = UIDocumentMenuViewController(documentTypes: [String(kUTTypePDF)], in: .import)

    importMenu.popoverPresentationController?.sourceView = self.view // so that iPads won't crash

    importMenu.delegate = self
    importMenu.modalPresentationStyle = .formSheet
    self.present(importMenu, animated: true, completion: nil)

答案 3 :(得分:0)

我为Mac Catalyst支付的2美分:

在Mac Catalyst上,您必须使用.formSheet

如此:

   #if targetEnvironment(macCatalyst)
    let modalPresentationStyle : UIModalPresentationStyle = .formSheet
    #else
    let modalPresentationStyle : UIModalPresentationStyle = .popover
    #endif

    optionsVC.modalPresentationStyle = modalPresentationStyle
    optionsVC.popoverPresentationController?.sourceView = self.view

    self.present(optionsVC, animated: true) {
    }

最终添加:

optionsVC.modalPresentationStyle = modalPresentationStyle

为防止外部窃听,系统将在不调用回调的情况下关闭(仅限iOs13 / Catalyst)