SwiftUI报错:failed to produce diagnostic for expression,求助修复PrayerView问题
修复「failed to produce diagnostic for expression」错误的解决方案
针对你PrayerView中的代码,导致该编译错误的几个关键问题及修复方案如下:
1. Picker样式修饰符位置错误
你将.pickerStyle(SegmentedPickerStyle())错误绑定到了最后一个Text选项上,这属于语法错误,应该将其作为Picker的修饰符:
// 修复前 Picker(selection: $viewModel.selectedCategory, label: Text("問題種類")) { // ...其他选项 Text("結親緣").tag("結親緣") .pickerStyle(SegmentedPickerStyle()) } // 修复后 Picker(selection: $viewModel.selectedCategory, label: Text("問題種類")) { Text("願望").tag("願望") Text("疾病").tag("疾病") Text("盼望的人").tag("盼望的人") Text("遺失物").tag("遺失物") Text("搬家").tag("搬家") Text("蓋新居").tag("蓋新居") Text("嫁娶").tag("嫁娶") Text("交往").tag("交往") Text("旅行").tag("旅行") Text("結親緣").tag("結親緣") } .pickerStyle(SegmentedPickerStyle()) // 移至Picker外部作为全局样式
2. NavigationLink绑定语法错误
selection: $viewModel.shouldShowResult?中的多余问号会导致SwiftUI无法正确解析绑定,直接移除即可:
// 修复前 NavigationLink( destination: ResultView(viewModel: ResultViewModel(lotViewModel: lotViewModel)), tag: true, selection: $viewModel.shouldShowResult?) { EmptyView() } // 修复后 NavigationLink( destination: ResultView(viewModel: ResultViewModel(lotViewModel: lotViewModel)), tag: true, selection: $viewModel.shouldShowResult) { EmptyView() }
3. 视图层级修饰符应用错误
你将.background()修饰符直接附加到if-else视图结构上,这会导致ViewBuilder解析失败,应将隐藏的NavigationLink改为VStack的直接子元素:
// 修复后的VStack结构 VStack { // 显示抽签结果分支 if viewModel.lotNumber != 0 { // ...LotView、Picker、解签按钮代码 } else { // ...抽签按钮代码 } // 修正层级:作为VStack的直接子元素 NavigationLink( destination: ResultView(viewModel: ResultViewModel(lotViewModel: lotViewModel)), tag: true, selection: $viewModel.shouldShowResult) { EmptyView() } .hidden() }
完整修复后的代码
// // PrayerView.swift import SwiftUI import CoreData struct PrayerView: View { @ObservedObject var viewModel: PrayerViewModel @ObservedObject var lotViewModel: LotViewModel init(container: NSPersistentContainer) { lotViewModel = LotViewModel(container: container) viewModel = PrayerViewModel(lotViewModel: lotViewModel) } var body: some View { VStack { // 顯示抽籤結果 if viewModel.lotNumber != 0 { LotView(viewModel: viewModel.lotViewModel) .padding() // 問題種類選擇器 Picker(selection: $viewModel.selectedCategory, label: Text("問題種類")) { Text("願望").tag("願望") Text("疾病").tag("疾病") Text("盼望的人").tag("盼望的人") Text("遺失物").tag("遺失物") Text("搬家").tag("搬家") Text("蓋新居").tag("蓋新居") Text("嫁娶").tag("嫁娶") Text("交往").tag("交往") Text("旅行").tag("旅行") Text("結親緣").tag("結親緣") } .pickerStyle(SegmentedPickerStyle()) // 隨喜功德解籤按鈕 NavigationLink(destination: PaymentView(viewModel: viewModel.paymentViewModel)) { Text("隨喜功德解籤") } .padding() } else { Button(action: { viewModel.drawLot() }, label: { Text("抽籤") }) .padding() } // 修正层级的隐藏导航链接 NavigationLink( destination: ResultView(viewModel: ResultViewModel(lotViewModel: lotViewModel)), tag: true, selection: $viewModel.shouldShowResult) { EmptyView() } .hidden() } } } struct PrayerView_Previews: PreviewProvider { static var previews: some View { let container = NSPersistentContainer(name: "MyAppDataModel") container.loadPersistentStores { _, error in if let error = error { fatalError("Unresolved error \(error)") } } return PrayerView(container: container) } }
以上均为SwiftUI视图解析时常见的语法/层级问题,修复后即可解决该编译错误。
内容的提问来源于stack exchange,提问作者Lotloy
相关产品推荐
相关产品推荐

