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

标签 swift filter swiftui bindable

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

相关文章:

ios - 如何声明实现多个协议(protocol)的参数

ios - 错误: Undefined symbols for architecture arm64 when Embed Unity(Vuforia) in IOS project(swift)

javascript - 使用 moment.js 按 'last month' 和 'last week' 过滤点击时的对象数组

javascript - es6 通过过滤对象数组过滤对象数组

swiftui - 所有 SwiftUI View 类型的列表

ios - 如何在 swift 中暂时使我的 uiImage 变灰?

swift - 如何使用 Swift 创建 TableView 单元格 TextView 的动态高度?

ios - 使用 SwiftUI 如何强制 DatePicker 使用 24 小时日期格式而不是用户设备上的区域设置

java - 记录 Spring REST API

ios - 基于内容的具有 PageTabViewStyle 动态高度的 SwiftUI TabView