UIPopoverController *popCtrl = [[UIPopoverController alloc] initWithContentViewController:self.rootViewController.navigationController];
popCtrl.delegate = self;
[popCtrl presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
Run Code Online (Sandbox Code Playgroud)
此代码位于按钮操作中,其中按钮是"发件人".
带有presentPopoverFromBarButtonItem的行会导致抛出异常,原因如下:Application tried to present modally an active controller DetailViewController: 0x15a54c00.在这种情况下,DetailViewController是"self",它只是popCtrl的委托,所以我看不出它是如何尝试以模态方式呈现的.它应该呈现rootViewController.navigationController.
正如您可能已经从名称中猜到的那样,rootViewController和detailViewController在SplitViewController中,但在尝试使用popover呈现rootViewController之前,它将从SplitViewController中删除.
这仅在使用iOS 8 SDK构建时在iOS 8上发生.它也不是100%可重复的.大多数情况下会发生此异常,但有时在我重新启动应用程序之后,在我重新运行应用程序之前它根本不会发生,然后它会一直开始发生.(我把它放在一个try/catch中,所以我知道每次运行可以发生多次.)
我几乎肯定这是SDK中的另一个iOS 8错误,但有没有人想出一个解决方法?
我在 IBAction 中以编程方式使用 iOS 8 中的弹出窗口。我不知道这是否是一个错误,但我确实知道他们确实对模式视图和演示文稿进行了一些更改。上面有一个不错的WWDC视频,看看你能不能找到。我这样做的方式(记住这是 Swift,所以你需要做一些翻译)如下:
let controller = self.settingsVC
controller.preferredContentSize = CGSizeMake(345, 234)
controller.modalPresentationStyle = UIModalPresentationStyle.Popover
var settingsPopController = controller.popoverPresentationController
settingsPopController?.delegate = self
settingsPopController?.sourceView = self.view
settingsPopController?.sourceRect = sender.frame
controller.modalPresentationStyle = UIModalPresentationStyle.Popover
self.presentViewController(controller, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
在此代码中, self.settingsVC 是我设置的 ViewController 的一个属性,它被初始化为情节提要中的另一个 ViewController,但您可以将控制器替换为需要作为弹出窗口呈现的 ViewController。另请注意,您的 UIViewController 类必须实现 UIPopoverPresentationControllerDelegate。如果您在翻译方面需要任何帮助,我很乐意为您提供帮助。