麻烦在iOS 9中使用barButtonItem进行popoverPresentationController?

时间:2015-07-23 14:41:09

标签: ios

我有一些使用新的UIAlertController类的代码,它在iOS 8中运行得很好。它现在在iOS 9中崩溃,并出现以下错误消息:

2015-07-23 10:38:27.499 MyApp[828:563509] -[UITabBarItem _viewForPresenting]: unrecognized selector sent to instance 0x157644960
2015-07-23 10:38:27.500 MyApp[828:563509] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITabBarItem _viewForPresenting]: unrecognized selector sent to instance 0x157644960'

问题似乎是使用barButtonItem字段来配置popoverPresentationController,而不是仅使用sourceView / sourceRect事物。如果我切换到后者,那很好(但当然,动作表不会从我想要弹出的位置弹出)。到目前为止,谷歌搜索错误消息已经空白。

这是代码。这是非常基本的,没有什么花哨的东西在这里:

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"What do you want to do?" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
    [alertController addAction:[UIAlertAction actionWithTitle:@"Clear Call History" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
        [self confirmClearCallHistory];
    }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]];
    [alertController setModalPresentationStyle:UIModalPresentationPopover];

    //if I do this (like I want to), it crashes:
    [alertController popoverPresentationController].barButtonItem = self.tabBarController.callsTab;

    // if I do this, it's fine:
    // [alertController popoverPresentationController].sourceView = self.editButton;
    //  [alertController popoverPresentationController].sourceRect = self.editButton.bounds;

    [self presentViewController:alertController animated:YES completion:nil];

其他人有类似的问题吗?到目前为止,在所有三个iOS 9测试版中都是一样的......

(哦,我应该提到它只在iPad上崩溃,而不是在iPhone上崩溃......但这并不奇怪,因为动作表的演示模式是iPhone上的无操作,即所有动作表都呈现无论如何都一样)

4 个答案:

答案 0 :(得分:2)

哦,有趣。我实际上是将UITabBarItem实例传递给barButtonItem字段。 (我继承了旧的代码,所以我没有意识到这一点)不知何故,这实际上适用于iOS 8?去图。

所以,是的,我猜不能这样做。 HEH。

答案 1 :(得分:2)

这是我使用的方法。我从UIBarButtonItem获取视图值并将其用作源视图。

 func settingsButtonAction(sender:UIBarButtonItem) {
        let viewController = UIViewController()
        viewController.modalPresentationStyle = .Popover
        if let presenter = viewController.popoverPresentationController {
            let targetView = sender.valueForKey("view") as! UIView
            presenter.sourceView = targetView;
            presenter.sourceRect = targetView.bounds;
        }
        presentViewController(viewController, animated: true, completion: nil)
    }

答案 2 :(得分:1)

在处理程序方法中,如果您将发件人设置为“AnyObject”。 你可以直接申请,

alertController.popoverPresentationController?.sourceRect = sender.bounds
alertController.popoverPresentationController?.sourceView = sender as? UIView
self.presentViewController(alertController, animated: true, completion: nil)

答案 3 :(得分:0)

哦,太酷了!看起来您可以在UIPopoverPresentationController上设置源栏按钮项。

popoverPresentationController?.barButtonItem = myBarButtonItem

我这样做了,它完美无缺,无需挖掘私人子视图。

根据文档,这已经从iOS 8开始提供。因此它也一直存在于iOS 9中。