gpt4 book ai didi

swift - 将过滤后的@Bindable 对象传递给 SwiftUI 中的多个 View

转载 作者:搜寻专家 更新时间:2023-11-01 06:50:45 24 4
gpt4 key购买 nike

我试图将过滤器数组传递给多个 View ,但过滤不起作用。如果我删除过滤器,您可以将数组传递给下一个 View ,但这会在 ForEach 循环期间导致另一个错误。我已经在下面发布了所有代码。

有谁知道如何传递@Bindable 数组的过滤器版本?另外,为什么我不能在 ForEach 循环中打印 sport.name 和 sport.isFavorite.description?

我在 Xcode 11.0 beta 5 上使用 swiftUI。

import SwiftUI
import Combine

struct Sport: Identifiable{
var id = UUID()
var name : String
var isFavorite = false
}

final class SportData: ObservableObject {
@Published var store =
[
Sport(name: "soccer", isFavorite: false),
Sport(name: "tennis", isFavorite: false),
Sport(name: "swimming", isFavorite: true),
Sport(name: "running", isFavorite: true)
]
}

struct Testing: View {
@ObservedObject var sports = SportData()

var body: some View {
VStack {
TestingTwo(sports: $sports.store.filter({$0.isFavorite}))
}
}
}

struct TestingTwo: View {
@Binding var sports : [Sport]

var body: some View {t
NavigationView {
VStack(spacing: 10){
ForEach($sports) { sport in
NavigationLink(destination: TestingThree(sport: sport)){
HStack {
Text(sport.name)
Spacer()
Text(sport.isFavorite.description)
}
.padding(.horizontal)
.frame(width: 200, height: 50)
.background(Color.blue)
}
}
}
}
}
}

struct TestingThree: View {
@Binding var sport : Sport

var body: some View {
VStack {
Text(sport.isFavorite.description)
.onTapGesture {
self.sport.isFavorite.toggle()
}
}
}
}


#if DEBUG
struct Testing_Previews: PreviewProvider {
static var previews: some View {
Testing()
}
}
#endif

最佳答案

根据您的绑定(bind)要求,您的情况下的过滤可能更好地放置在导航 View 中。

struct Testing: View {
@ObservedObject var sports = SportData()

var body: some View {
VStack {
TestingTwo(sports: $sports.store)
}
}
}

struct TestingTwo: View {
@Binding var sports : [Sport]
@State var onlyFavorites = false

var body: some View {t
NavigationView {
VStack(spacing: 10){
ForEach($sports) { sport in
if !self.onlyFavorites || sport.value.isFavorite {
NavigationLink(destination: TestingThree(sport: sport)){
HStack {
Text(sport.value.name)
Spacer()
Text(sport.value.isFavorite.description)
}
.padding(.horizontal)
.frame(width: 200, height: 50)
.background(Color.blue)
}
}
}
}
}
}
}

现在您可以切换 isFavorite在按钮的操作实现中或在指定您的集成时声明 TestingTwo查看。

struct Testing: View {
@ObservedObject var sports = SportData()

var body: some View {
VStack {
TestingTwo(sports: $sports.store, onlyFavorites: true)
}
}
}

关于你问题的第二部分:注意 value ForEach 中的附录环形。你在这里处理 as 绑定(bind)(如 ForEach($sports) 所示),因此 sport不是 Sport 的实例.

关于swift - 将过滤后的@Bindable 对象传递给 SwiftUI 中的多个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57454809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com