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
相关产品推荐
相关产品推荐

