为了将来参考,最好将您收到的警告文本也包含在问题中。
我的猜测是:
警告:尝试在 <ViewController: 0x7fe674e02f50> 上呈现 <UIAlertController: 0x7fe676036000> 已经呈现 <UIActivityViewController: 0x7fe67580f800>
这基本上表明您不能使用已经呈现单独视图控制器的视图控制器来呈现另一个视图控制器。
您可以解决此问题的一种方法是爬上presentedViewControllers 以找到尚未呈现的视图控制器,然后从中呈现(在您的情况下,您只需要将一个presentedViewController 向上移动到您的UIActivityViewController)。
这是一个使用UIWindowScene获取 rootViewController (iOS 13+) 的示例,但对于使用 appDelegate 的窗口也应该基本相同:
- (IBAction)showShareSheetAndAlert:(id)sender {
UIImage *homerImage = [UIImage imageNamed:@"Homer"];
UIActivityViewController *shareSheet = [[UIActivityViewController alloc] initWithActivityItems:@[homerImage] applicationActivities:nil];
[self presentViewController:shareSheet animated:YES completion:^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Test Alert" message:@"Here's a test alert on top of a share sheet" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *dismissAction = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:dismissAction];
UIWindowScene *windowScene = (UIWindowScene *)[[[[UIApplication sharedApplication] connectedScenes] allObjects] firstObject];
UIViewController *viewControllerToPresentOn = windowScene.windows.firstObject.rootViewController;
// keep climbing the presented view controllers until we find the top one which isn't presenting
while (viewControllerToPresentOn.presentedViewController != nil) {
viewControllerToPresentOn = viewControllerToPresentOn.presentedViewController;
}
[viewControllerToPresentOn presentViewController:alert animated:YES completion:nil];
}];
}
这将导致:
