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

Swift 3中启动视图内UIAlertController无法正常工作

解决UIAlertController在视图启动时不弹出的问题

嘿,这个问题我太熟了!你在viewDidLoad里调用present弹出警告框没反应,核心原因是**viewDidLoad执行时,你的控制器视图还没完全加入到窗口的层级结构里**——present方法要求当前控制器的视图已经处于活跃的显示状态,不然系统没法把警告框正确挂载上去。

给你两个可行的解决方案:

方案1:移到viewDidAppear生命周期方法(推荐)

viewDidAppear(_:)是在视图已经完全显示到屏幕上之后才会触发的方法,此时执行present操作完全符合iOS的生命周期规范,不会有任何问题。修改后的代码如下:

import UIKit
class StartController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        startTest()
    }

    func startTest() {
        let alerta = UIAlertController(title: "Invalid Test", message: "Testing alert controller", preferredStyle: .alert)
        alerta.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alerta, animated: true, completion: nil)
    }
}

方案2:用主队列异步延迟执行(临时方案)

如果因为某些原因你必须在viewDidLoad里触发弹出,可以把present的代码包在主队列的异步调用里,让它等当前的视图加载循环完成后再执行:

func startTest() {
    DispatchQueue.main.async {
        let alerta = UIAlertController(title: "Invalid Test", message: "Testing alert controller", preferredStyle: .alert)
        alerta.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alerta, animated: true, completion: nil)
    }
}

不过还是优先推荐方案1,因为它更贴合iOS的设计逻辑,能避免一些潜在的边缘问题。

内容的提问来源于stack exchange,提问作者cdub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:41