我有一些使用新的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上的无操作,即所有动作表都呈现无论如何都一样)
答案 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)
popoverPresentationController?.barButtonItem = myBarButtonItem
我这样做了,它完美无缺,无需挖掘私人子视图。
根据文档,这已经从iOS 8开始提供。因此它也一直存在于iOS 9中。