代码之家  ›  专栏  ›  技术社区  ›  Ian Warburton

列表未绑定到筛选的集合

  •  0
  • Ian Warburton  · 技术社区  · 4 年前

    这是我的名单。。。

    List {
        
        ForEach(viewModel.flight.flightEvents, id: \.id) { flightEvent in
            
            ...
        }
    }
    

    视图模型有这个。。。

    @Published var flight: Flight
    

    Flight 看起来像这样。。。

    struct Flight: Identifiable {
            
        let flightEvents: [FlightEvent]
        
        let id = UUID()
    }
    

    FlightEvent ...

    struct FlightEvent: Identifiable {
        
        let id = UUID()
        
        let dateComponents: DateComponents
    }
    

    此代码导致以下项目 flightEvents 数组立即绑定到列表。

    但是,如果我将绑定到列表的集合更改为。。。

    viewModel.flight.flightEvents.filter { $0.dateComponents.date! <= Date() }
    

    …那么这些项目就永远不会出现在列表中——过滤器从一开始就对每个项目都是假的。我有一个解决方法,当用户刷新并绑定此数组时,我将过滤后的航班事件复制到另一个数组中。

    有没有一种方法可以让SwiftUI连续计算过滤器表达式?我认为它没有约束力,因为基础收藏没有改变。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Asperi    4 年前

    有没有一种方法可以让SwiftUI连续计算过滤器表达式?

    事实上,没有。这会导致不可阻挡的视图重绘,这是非常不可取的。但你可以设置定时器(比如1秒或更长时间)并强制回调

    viewModel.objectWillCange.send()