来自iOS8 GM的Popover的UIActionSheet

任何人都试图从popup窗口显示UIActionSheet时得到这个消息?

你的应用程序提供了UIAlertControllerStyleActionSheet风格的UIAlertController()。 具有此样式的UIAlertController的modalPresentationStyle是UIModalPresentationPopover。 您必须通过警报控制器的popoverPresentationController为此popup窗口提供位置信息。 您必须提供sourceView和sourceRect或barButtonItem。 如果在显示警报控制器时不知道此信息,则可以在UIPopoverPresentationControllerDelegate方法-prepareForPopoverPresentation中提供此信息。

在此之前,我使用了一些解决方法将UIActionSheet转换为UIAlertController,并且工作正常。 但是,似乎苹果试图解决UIActionSheet问题,我不想使用我的解决方法 – 但似乎我没有select…

为了支持iPad,请包含以下代码:

alertView.popoverPresentationController?.sourceView = self.view alertView.popoverPresentationController?.sourceRect = self.view.bounds // this is the center of the screen currently but it can be any point in the view self.presentViewController(alertView, animated: true, completion: nil) 

如果您在用户在UITableView某个单元格上进行select之后呈现操作表单。 我发现这个工作得很好:

 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Directions" message:@"Select mode of transportation:" preferredStyle:UIAlertControllerStyleActionSheet]; alert.popoverPresentationController.sourceView = cell; alert.popoverPresentationController.sourceRect = cell.bounds; UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]; //... [self presentViewController:alert animated:YES completion:nil]; 

您需要为iPad提供popoverPresentationController支持。 在这里,你可以指定barButtonItem或者sourceView 。 这另一个线程可能会帮助你: Swift UIAlertController – ActionSheet iPad iOS8崩溃

其实这是在Xcode的iPhone和iPad的devise现在是错误的(我相信)。

  1. 在iPhone中,相同的代码完美工作,您可以在相同的位置(始终)看到警报消息。 但是对于iPad,您需要使用alert.popoverPresentationController.sourceView = self.view; alert.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0 - 105, self.view.bounds.size.height / 2.0 + 70, 1.0, 1.0);来定义警报框的位置alert.popoverPresentationController.sourceView = self.view; alert.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0 - 105, self.view.bounds.size.height / 2.0 + 70, 1.0, 1.0); alert.popoverPresentationController.sourceView = self.view; alert.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0 - 105, self.view.bounds.size.height / 2.0 + 70, 1.0, 1.0); 由于不同的锚点,105和70是iPad纵向devise的近似尺寸差异。
  2. 在iPhonedevise中, UIAlertController附带了“Modal View”,但不幸的是,如果你使用相同的代码的iPad它不会是一个“模态视图”。 这意味着您需要编写额外的代码来禁用iPaddevise中的触摸。 我觉得这很奇怪。
  3. 在iPaddevise中,你需要考虑到这个锚点是不同的。 这是泡沫三angular点,而不是AlertView的左上angular。

这些是我看到的奇怪的东西。 我认为必须有一个标准,如果有人想要出去的标准,罚款,可以有其他的select。

UIAlertController只是iOS8,需要支持iOS7,我正在使用它。 我在iPad上以Master / Detail布局在Master视图中遇到了这个问题。 我能够通过使用[actionSheet showInView:]从父级UISplitViewController提升UIActionSheet来解决它(不完全解决它)。 祝你好运。