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

iOS15 Swift Playgrounds中SwiftUI混用UIViewController编译卡顿求助

编译报错:无法构建应用,编译器无法检查错误的解决方法

问题现象

编译项目时持续加载,提示:无法构建应用,当前编译器无法检查错误,请尝试拆分为子表达式。

代码中的问题分析

你的代码存在两处关键错误,导致编译器无法正常解析:

  1. 语法错误:大括号未闭合

    • UIAlertAction的handler闭包缺少闭合的}
    • viewDidAppear方法整体缺少闭合的}
      这种语法不完整会让编译器陷入解析困境,出现你遇到的报错。
  2. 逻辑错误:错误的Alert调用位置
    在"Done"按钮的回调中调用present(alert, animated: true)是错误的,此时Alert已经被展示,该操作会导致重复展示的问题,且违背逻辑流程。另外,DispatchQueue.main.asyncAfter在这里完全没有必要,回调本身就在主线程执行。

修正后的代码

struct ContentView: View{
     var body: some View{
           Controller()
     }
}

struct Controller: UIViewControllerRepresentable{
     func makeUIViewController(context: Context) -> Contro {
          let viewController = Contro()
          //additional setup
          return viewController
     }
     func updateUIViewController(_ uiViewController: Contro, context: Context) {
         //update Content
     }
}

class Contro: UIViewController{
     override func viewDidAppear(_ animated: Bool){
          super.viewDidAppear(animated) // 调用父类生命周期方法
          
          let alert = UIAlertController(title: "Rename Subject", message: "", preferredStyle: .alert)
          alert.addTextField{ value in
              value.placeholder = "subject name"
              value.returnKeyType = .continue
          }
          alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { _ in
              self.dismiss(animated: true)
          }))
          alert.addAction(UIAlertAction(title: "Done", style: .default, handler: { _ in
            guard let fields = alert.textFields, fields.count == 1 else {
                self.dismiss(animated: true)
                return
            }
            guard let texts = fields[0].text, !texts.isEmpty else {
                self.dismiss(animated: true)
                return
            }
            UserDefaults.standard.set(texts, forKey: "RenamedSubjectName")
            self.dismiss(animated: true)
        }))
          
          present(alert, animated: true) // 将Alert展示逻辑移到正确位置
     }
}

额外优化说明

  • 补充super.viewDidAppear(animated):重写生命周期方法时必须调用父类实现,避免潜在的页面异常。
  • 给Cancel按钮添加dismiss:确保点击取消时Alert能正常关闭。
  • 所有guard分支添加dismiss:避免输入无效时Alert一直停留在界面上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:24:17