问题状态:
Thread 1: "UIPopoverPresentationController (<UIPopoverPresentationController: 0x12f33b020>) should have a non-nil sourceView or barButtonItem set before the presentation occurs."
问题原因
iPad中UIAlertController的UIAlertControllerStyleActionSheet样式和iOS的实现方法有细微差别,iOS中是底部屏幕弹出,而iPad 因为其屏幕大的原因,弹窗是以气泡形式展现的,而气泡的形式需要提供气泡展示的位置与载体,在找不到相关实现的情况下,App Crash
解决方法
在使用UIAlertControllerStyleActionSheet样式的情况下,需要区分是iPad还是iPhone,或者其他设备;
Obj-C方法
UIButton *button; // 如在button按钮的点击实现 UIAlertController 选项 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *destroyAction = [UIAlertAction actionWithTitle:@"删除" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { // do destructive stuff here }]; UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"返回" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // do something here }]; [alertController addAction:destroyAction]; [alertController addAction:otherAction]; 方法一:判断是有popPresenter,iPhone默认是没有的 UIPopoverPresentationController *popPresenter = [alertController popoverPresentationController]; // 获取alertController 样式 if (popPresenter) { popPresenter.sourceView = button; // 在哪个View上显示 popPresenter.sourceRect = button.bounds; // 指定箭头指向区域与大小 [self presentViewController:alertController animated:YES completion:nil]; } 方法二:判断设备 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { UIPopoverPresentationController *popPresenter = [alertController popoverPresentationController]; // 获取alertController 样式 popPresenter.sourceView = button; // 在哪个View上显示 popPresenter.sourceRect = button.bounds; // 指定箭头指向区域与大小 [self presentViewController:alertController animated:YES completion:nil]; }
Swift 4.2+
/// Swift 4.2+ 方法一:按类型 if let popoverController = yourAlert.popoverPresentationController { popoverController.sourceView = button popoverController.sourceRect = button.bounds } 方法二:按设备 if (UIDevice.current.userInterfaceIdiom == .pad) { /// .... 省略,请参考Obj-C 实现 }
文章评论