You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
}

额外注意事项

  1. 我帮你补全了present方法的必填参数(animated: true, completion: nil),原代码里这部分没写完
  2. 添加了@unknown default分支,这是Swift 5+推荐的写法,用来处理枚举未来可能新增的成员,避免编译警告
  3. 如果这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:21:40