Swift 4错误弹窗实现:调用present方法触发SIGABORT问题求助
SIGABORT错误原因与修复方案
嘿,我一眼就揪出问题所在了——你在代码里犯了个非常典型的低级错误:你让UIAlertController实例自己调用present方法来展示自己!
看你代码的最后一行(虽然没写完,但核心问题很明显):
alertController.present(alertController, animat
这完全违反了UIKit的视图控制器展示规则:弹窗类的视图控制器(比如UIAlertController)必须由当前活跃的视图控制器(比如你的ViewController实例)来调用present方法,而不是自己present自己,这种不合理的调用直接触发了SIGABORT崩溃。
修复后的完整代码
func alert(message: String, title: String = "") { let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { action in switch action.style { case .default: print("default") case .cancel: print("cancel") case .destructive: print("destructive") @unknown default: // 兼容未来可能新增的UIAlertActionStyle枚举值,避免编译警告 print("unknown alert action style") } })) // 关键修正:用当前视图控制器(self)来展示弹窗,而不是alertController自己 self.present(alertController, animated: true, completion: nil) }
额外注意事项
- 我帮你补全了present方法的必填参数(
animated: true, completion: nil),原代码里这部分没写完 - 添加了
@unknown default分支,这是Swift 5+推荐的写法,用来处理枚举未来可能新增的成员,避免编译警告 - 如果这个alert方法不是定义在ViewController类内部(比如放在工具类里),你需要传入一个视图控制器实例作为参数,修改方法如下:
func alert(message: String, title: String = "", from presentingVC: UIViewController) { // ... 其余代码不变 ... presentingVC.present(alertController, animated: true, completion: nil) }
调用的时候传当前的视图控制器即可,比如alert(message: "测试弹窗", from: self)
内容的提问来源于stack exchange,提问作者doodle
相关产品推荐
相关产品推荐

