无法将类型为"绑定<数据结构?>"的值转换为预期的参数类型"绑定<数据结构>



我有一些代码,使'市场'。市场上有两种观点,"衬衫"和;"裤子"。当用户点击一件物品(一件衬衫或一条裤子)时,它会将他们带到该物品的详细视图。这就是我面临的一个问题。

这是市场的代码:

@StateObject var MarketplaceModel = MarketplaceViewModel()

@State private var selectedMarketplaceFilter: MarketplaceFilterViewModel = .shirt

@Namespace var animation : Namespace.ID

@State var selectedShirt : Shirt!

// Shared Data...
@EnvironmentObject var sharedData: SharedDataModel

@Binding var shirtData : Shirt
@Binding var showDetailShirt: Bool

@Binding var trouserData : Trouser
@Binding var showDetailTrouser: Bool

var body: some View {

ScrollView(.vertical, showsIndicators: false) {

VStack(spacing: 10){


if !showDetailShirt && !showDetailTrouser {

marketplaceFilterBar

}

if selectedMarketplaceFilter == .shirt {
MarketplaceShirtView()
}

if selectedMarketplaceFilter == .trouser {
MarketplaceTrouserView()
}
}
}

这是衬衫&裤子(两个数据结构相同):

import SwiftUI
import FirebaseFirestoreSwift
import Firebase
struct Shirt: Identifiable, Codable {

@DocumentID var id: String?
var shirt_name: String
var shirt_type: String
var shirt_image: String
var shirt_details: String
var shirt_uid : String

}

我SharedDataModel:

import SwiftUI
class SharedDataModel: ObservableObject {

// Detail Shirt Data...
@Published var detailShirt : Shirt?
@Published var showDetailShirt : Bool = false

// Detail Trouser Data...
@Published var detailTrouser : Business?
@Published var showDetailTrouser : Bool = false

}

这是DetailView(衬衫&裤子):

@Binding var shirtData : Shirt
@Binding var showDetailShirt: Bool

@Namespace var animation: Namespace.ID

// Shared Data Model...
@EnvironmentObject var sharedData: SharedDataModel

@EnvironmentObject var marketplaceData: MarketplaceViewModel


var body: some View {

VStack{

VStack{

HStack {

Button(action: {
withAnimation(.easeOut){showDetailShirt.toggle()}
}) {
Image(systemName: "arrow.backward.circle.fill")

}


Text(shirtData.shirt_name)

}

GeometryReader { geo in
WebImage(url: URL(string: shirtData.shirt_image))
.resizable()
.scaledToFit()
.frame(width: geo.size.width * 1, height: 300)
}
}

ScrollView(.vertical, showsIndicators: false) {

VStack(alignment: .leading, spacing: 15) {

Text(shirtData.shirt_name)

Text(shirtData.shirt_type)

Text(shirtData.shirt_details)
}
}
}
}

这是我的MarketplaceShirtView代码

@StateObject var MarketplaceModel = MarketplaceViewModel()

@State private var selectedMarketplaceFilter: MarketplaceFilterViewModel = .shirt

@Namespace var animation : Namespace.ID

@State var showDetailShirt = false
@State var selectedShirt : Shirt!

// Shared Data...
@EnvironmentObject var sharedData: SharedDataModel

var body: some View {

var columns = Array(repeating: GridItem(.flexible()), count: 2)

ZStack{

VStack(spacing: 10){

HStack {

Text("Find Shirts To Buy")
.font(.headline)
}


HStack(spacing: 5) {

HStack(spacing: 12){

Image(systemName: "magnifyingglass")
.font(.subheadline)

TextField("Search", text: $MarketplaceModel.search)

}
.background(Color.white)

Button {

} label: {
Image(systemName: "slider.horizontal.3")
.foregroundColor(.gray)
}
}

if MarketplaceModel.shirts.isEmpty{
ProgressView()
}
else{

ScrollView(.vertical, showsIndicators: false, content: {
LazyVGrid(columns: Array(repeating: GridItem(.flexible(),spacing: 10), count: 2),spacing: 20){

ForEach(MarketplaceModel.filteredShirt){shirt in

// This is a grid view of items (Shirts)

ShirtView(shirtData: shirt)
.onTapGesture {
selectedShirt = shirt
showDetailShirt.toggle()
}
}
})
}
}
//ERROR HERE: 'Cannot convert value of type 'Binding<Shirt?>' to expected argument type 'Binding<Shirt>'
if selectedShirt != nil && showDetailShirt{

ShirtDetailView(shirtData: $selectedShirt, showDetailShirt: $showDetailShirt,animation: _animation)
}
}

在这种情况下,我认为只要打开绑定就足够了,比如

if selectedShirt != nil && showDetailShirt{

ShirtDetailView(shirtData: Binding($selectedShirt)!, showDetailShirt: $showDetailShirt,animation: _animation)
}

最新更新