我试图将过滤器数组传递给多个 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/