47

尝试从弹出窗口显示 UIActionSheet 时有人收到此消息吗?

您的应用程序呈现了一个 UIAlertController() 样式的 UIAlertControllerStyleActionSheet。具有此样式的 UIAlertController 的 modalPresentationStyle 是 UIModalPresentationPopover。您必须通过警报控制器的 popoverPresentationController 提供此弹出窗口的位置信息。您必须提供 sourceView 和 sourceRect 或 barButtonItem。如果在您呈现警报控制器时不知道此信息,您可以在 UIPopoverPresentationControllerDelegate 方法 -prepareForPopoverPresentation 中提供它。

在 GM 之前,我使用了一些解决方法将 UIActionSheet 转换为 UIAlertController,这工作正常。然而,Apple 似乎试图解决 UIActionSheet 问题,而我不想使用我的解决方法 - 但似乎我别无选择......

4

6 回答 6

105

要支持 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)
于 2014-12-12T09:52:16.433 回答
11

如果您在用户在UITableView. 我发现这很好用:

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];
于 2015-12-06T17:54:10.390 回答
7

您需要提供popoverPresentationControlleriPad 支持。在此,您可以指定barButtonItemsourceView。这个另一个线程可以帮助你:Swift UIAlertController - ActionSheet iPad iOS8 Crashes

于 2014-09-25T21:31:00.660 回答
2

实际上,现在 iPhone 和 iPad 设计的 Xcode 中存在一些错误(我相信)。

  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);105 和 70 是 iPad 纵向设计由于锚点不同造成的近似尺寸差异。
  2. 在 iPhone 设计UIAlertController中带有“模态视图”,但不幸的是,如果您对 iPad 使用相同的代码,它将不是“模态视图”。这意味着您需要编写额外的代码来禁用 iPad 设计中的触摸。我认为这很奇怪。
  3. 在 iPad 设计中,您需要考虑锚点不同。它是气泡三角点,而不是 AlertView 的左上角。

这些都是我看到的奇怪的东西。我认为必须有一个标准,如果有人想出标准,很好,可以有其他选择。

于 2015-12-24T15:57:07.087 回答
1

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

于 2014-09-10T16:23:21.033 回答
1

如果您想在 iPad 上和通常在 iPhone 上不带箭头的中心显示它:[ Swift 3+ ]:

if let popoverController = alertController.popoverPresentationController {
    popoverController.sourceView = self.view
    popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
    popoverController.permittedArrowDirections = []
}
self.present(alertController, animated: true, completion: nil)
于 2019-01-04T10:33:39.977 回答