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

SwiftUI中TrouserDetailView调用及MainPage初始化报错求助

问题解决方案

一、解决MarketplaceTrouserView调用TrouserDetailView的参数错误

1. 调整TrouserDetailView的属性定义

  • trouserData是静态展示数据,用let声明即可,无需状态修饰
  • showDetailTrouser需要双向绑定控制弹窗显隐,改用@Binding修饰

修改后的TrouserDetailView代码:

import SwiftUI
import SDWebImageSwiftUI

struct TrouserDetailView: View {
    let trouserData: Trouser
    @Binding var showDetailTrouser: Bool
    @EnvironmentObject var sharedData: SharedDataModel    
    @EnvironmentObject var marketplaceData: MarketplaceViewModel
       
    var body: some View {
        ScrollView {
            VStack{
                HStack {
                    Button(action: {
                        withAnimation(.easeOut){
                            showDetailTrouser.toggle()
                        }
                    }) {
                        Image(systemName: "arrow.backward.circle.fill")
                    }
                    Text(trouserData.trouser_name)
                }
                VStack {
                    WebImage(url: URL(string: trouserData.trouser_image))   
                }
            }
        }
    }
}

2. 修正MarketplaceTrouserView的调用逻辑与语法错误

先修复原代码中ZStack结构闭合错误,再正确传入TrouserDetailView所需参数:

var body: some View {
    ZStack{  
        VStack{        
            HStack {
                Text("Find Trousers To Buy")
            }
            if MarketplaceModel.trousers.isEmpty{
                ProgressView()
            } else {
                ScrollView {
                    LazyVGrid(columns: Array(repeating: GridItem(.flexible(),spacing: 10), count: 2),spacing: 20){
                        ForEach(MarketplaceModel.filteredTrouser){trouser in
                            TrouserView(trouserData: trouser)
                                .onTapGesture {
                                    withAnimation {
                                        selectedTrouser = trouser
                                        showDetailTrouser.toggle()
                                    }
                                }
                        }
                    }
                }
            }
        }
        
        if selectedTrouser != nil && showDetailTrouser{
            TrouserDetailView(trouserData: selectedTrouser!, showDetailTrouser: $showDetailTrouser)
        }
    }
}

二、解决MainPage的初始化错误

@State属性不能在init中重新声明局部变量,以下两种方式均可解决:

方案1:直接在属性声明时初始化

struct MainPage: View {
    @StateObject var appModel: AppViewModel = .init()
    @StateObject var sharedData: SharedDataModel = SharedDataModel()

    @State var shirtData: Shirt = Shirt()
    @State var showDetailShirt: Bool = false   
    @State var trouserData: Trouser = Trouser()
    @State var showDetailTrouser: Bool = false
    @Namespace var animation
    
    init () {
        UITabBar.appearance().isHidden = true
    } 

    // 剩余body代码不变
}

方案2:在init中通过_属性名初始化(适用于动态初始化场景)

struct MainPage: View {
    @StateObject var appModel: AppViewModel = .init()
    @StateObject var sharedData: SharedDataModel = SharedDataModel()

    @State var shirtData: Shirt
    @State var showDetailShirt: Bool   
    @State var trouserData: Trouser
    @State var showDetailTrouser: Bool
    @Namespace var animation
    
    init () {
        _shirtData = State(initialValue: Shirt())
        _showDetailShirt = State(initialValue: false)
        _trouserData = State(initialValue: Trouser())
        _showDetailTrouser = State(initialValue: false)
        
        UITabBar.appearance().isHidden = true
    } 

    // 剩余body代码不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:24:24