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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:33:34