Ios UIPopoverPresentationController.barButtonItem不工作,似乎被忽略

Ios UIPopoverPresentationController.barButtonItem不工作,似乎被忽略,ios,ipad,uialertcontroller,ios13,Ios,Ipad,Uialertcontroller,Ios13,在iPad中显示类型为UIActionSheet的UIAlertController时出现问题。我知道iPad需要更多信息才能显示popover,但我遇到了一些奇怪的问题 我正在检查我的应用程序与iOS 13的兼容性问题,而像在UIBarButtonItem上使用performSelector获取视图这样的老把戏似乎已经不起作用了 方式1 所以我这样做 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { UIView*

在iPad中显示类型为
UIActionSheet
UIAlertController
时出现问题。我知道iPad需要更多信息才能显示popover,但我遇到了一些奇怪的问题

我正在检查我的应用程序与iOS 13的兼容性问题,而像在
UIBarButtonItem上使用
performSelector
获取视图这样的老把戏似乎已经不起作用了

方式1 所以我这样做

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    UIView* internalView = (UIView*) [weakSelf.navigationItem.rightBarButtonItem performSelector:@selector(view)];

    menuController.popoverPresentationController.sourceView = weakSelf.navigationController.navigationBar;
    menuController.popoverPresentationController.sourceRect = internalView.frame;
    menuController.popoverPresentationController.canOverlapSourceViewRect = YES;
}
internalView
似乎为零,而不是在旧版本的iOS中获得UIView。弹出框显示在屏幕的左上角,而不是导航栏按钮项附近

方式2 所以我试着用另一种方法,一种“正确的方法”,事实上,我想:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    menuController.popoverPresentationController.barButtonItem = weakSelf.navigationItem.rightBarButtonItem;
}
当我尝试使用此代码时,应用程序会崩溃,并显示一条消息,说明我必须设置sourceView/sourceRect/barButtonItem。但我告诉它去做

由于未捕获的异常“NSGenericeException”而终止应用程序,原因是:“您的应用程序已从UISmartNavigationController()提供了UIAlertControllerStyleActionSheet样式的UIAlertController()。具有此样式的UIAlertController的modalPresentationStyle为UIModalPresentationPopover。您必须通过警报控制器的popoverPresentationController提供此popover的位置信息。必须提供sourceView和sourceRect或barButtonItem。如果在演示警报控制器时不知道此信息,则可以在UIPopoverPresentationControllerDelegate方法-PrepareForPoverPresentation中提供此信息。”

我也尝试使用
UIPopoverPresentationControllerDelegate
,但得到了相同的结果


我检查并再次检查,
weakSelf.navigationItem.RightBarButtonim
不是nil并设置为右栏按钮项。我想我遗漏了一些重要的东西,但是什么呢?

苹果的文档提到了这个页面。 但是,示例代码引用了一个从未定义过的对象optionsControl。我可以得到几个变体来构建、部署和运行,但所有变体都会因类似错误而崩溃,如: 由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“UIPopoverPresentationController()应在演示发生之前设置非nil sourceView或barButtonItem。” 经过3天的阅读,我终于发现了这个页面,它帮助我创建了下面的工作版本。这比我尝试过的其他事情要简单得多。关键是将控制器的sourceView设置为父视图,对我来说,父视图是object.view,因为object是对作为发送方传入的父视图控制器的引用

static func transmitAirDrop(object: ProjectOrganizerMasterViewController) {
    NSLog("UTVCU.transmitAirDrop")
    if (StatusReportSettings.supportsAirdrop() == false) {
        self.sendMultipleXMLEmail(object: object)
        return;
    }
    let myDelegate : StatusReportAppDelegate = UITableViewController.sharedDelegate()
    let documentsDirectory : String = UITableViewController.persistProjectFiles(managedObjectContext: object.managedObjectContext, delegate: myDelegate as! ProjectOrganizerAppDelegate)

    let backupZipFileName : String = UITableViewController.backupExportZipFileName(StatusReportSettings.appSpecificFileName())!

    let password1 : String = object.passwordPromptController?.textFields?.first?.text ?? ""
    let backupZipFilePath : String = StatusReportMasterViewController.createPasswordProtectedExportZipFile(password1: password1, documentsDirectory: documentsDirectory)

    let url : URL = URL.init(fileURLWithPath: backupZipFilePath)
    NSLog("transmitAirDrop() url ->%@", url.path);



    let objectsToShare : NSArray = [url]

    NSLog("UTVCU.transmitAirDrop presentViewController calling");

    let controller = UIActivityViewController(activityItems: [url], applicationActivities: nil)
    controller.excludedActivityTypes = [.postToFacebook,
        .postToTwitter,
        .print,
        .copyToPasteboard,
        .assignToContact,
        .saveToCameraRoll]

    controller.popoverPresentationController?.sourceView = object.view


    object.present(controller, animated: true, completion: nil)


    NSLog("UTVCU.transmitAirDrop presentViewController returned");

}

Apple文档涉及此页面。 但是,示例代码引用了一个从未定义过的对象optionsControl。我可以得到几个变体来构建、部署和运行,但所有变体都会因类似错误而崩溃,如: 由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“UIPopoverPresentationController()应在演示发生之前设置非nil sourceView或barButtonItem。” 经过3天的阅读,我终于发现了这个页面,它帮助我创建了下面的工作版本。这比我尝试过的其他事情要简单得多。关键是将控制器的sourceView设置为父视图,对我来说,父视图是object.view,因为object是对作为发送方传入的父视图控制器的引用

static func transmitAirDrop(object: ProjectOrganizerMasterViewController) {
    NSLog("UTVCU.transmitAirDrop")
    if (StatusReportSettings.supportsAirdrop() == false) {
        self.sendMultipleXMLEmail(object: object)
        return;
    }
    let myDelegate : StatusReportAppDelegate = UITableViewController.sharedDelegate()
    let documentsDirectory : String = UITableViewController.persistProjectFiles(managedObjectContext: object.managedObjectContext, delegate: myDelegate as! ProjectOrganizerAppDelegate)

    let backupZipFileName : String = UITableViewController.backupExportZipFileName(StatusReportSettings.appSpecificFileName())!

    let password1 : String = object.passwordPromptController?.textFields?.first?.text ?? ""
    let backupZipFilePath : String = StatusReportMasterViewController.createPasswordProtectedExportZipFile(password1: password1, documentsDirectory: documentsDirectory)

    let url : URL = URL.init(fileURLWithPath: backupZipFilePath)
    NSLog("transmitAirDrop() url ->%@", url.path);



    let objectsToShare : NSArray = [url]

    NSLog("UTVCU.transmitAirDrop presentViewController calling");

    let controller = UIActivityViewController(activityItems: [url], applicationActivities: nil)
    controller.excludedActivityTypes = [.postToFacebook,
        .postToTwitter,
        .print,
        .copyToPasteboard,
        .assignToContact,
        .saveToCameraRoll]

    controller.popoverPresentationController?.sourceView = object.view


    object.present(controller, animated: true, completion: nil)


    NSLog("UTVCU.transmitAirDrop presentViewController returned");

}

“方式1”从来都不对。“方式2”是正确的,但您需要在正确的时间和地点调用它。而且不需要检查iPad。相同的代码在所有设备上都有效。你应该更新你的问题,为“方式2”显示更多代码。显示用于创建、设置和显示操作表的所有相关代码。找到问题的解决方案了吗?自从升级到iOS 13后,我也遇到了同样的问题。“方式1”从来都不正确。“方式2”是正确的,但您需要在正确的时间和地点调用它。而且不需要检查iPad。相同的代码在所有设备上都有效。你应该更新你的问题,为“方式2”显示更多代码。显示用于创建、设置和显示操作表的所有相关代码。找到问题的解决方案了吗?升级到iOS 13后,我也遇到了同样的问题。