1

我正在尝试将过滤器数组传递给多个视图,但过滤器不起作用。如果我删除过滤器,您可以将数组传递到下一个视图,但这会在 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
4

2 回答 2

3

由于您的绑定要求,在您的情况下进行过滤可能会更好地放置在导航视图中。

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您在此处处理为绑定(如ForEach($sports)所示),因此sport不是Sport.

于 2019-08-12T06:01:29.240 回答
2

您无法从计算属性中获取 @Binding,因为计算属性是动态计算的。避免这种情况的典型方法是传入运动对象的 id 和数据存储本身,从而您可以通过存储中的 id 访问运动项目。

如果你真的想传入一个@Binding你必须删除过滤器(传入一个实际支持的数组)并修改ForEach如下:

  ForEach($sports.store) { (sport: Binding<Sport>) in
于 2019-08-12T07:36:39.847 回答