在 SwiftUI 中使用 List 时,如何使用 NavigationLink isActive 绑定?

Asw*_*ath 3 ios swift swiftui swiftui-list swiftui-navigationlink

用例非常简单。我有一个地点列表,每个地点对应一个地理围栏。我需要在用户位于其地理围栏内的特定行中启用导航。该列表是动态的,是从 API 中获取的。Stackoverflow 上也有类似的问题,但这些问题仅针对静态列表。

我尝试使用布尔字典,但我无法使其工作。

这是一个简化的模拟代码:

struct ListView: View {
  @State private var navActive: [UUID: Bool] = [:]
  var body: some View {
    
           List (viewModel.allItems, id: \.id) { item in
           NavigationLink(destination: DetailView(item), isActive: $navActive[item.id]) {
             Text(item.name)
             .onTapGesture {
                if currentLocation.isInside(item.geofence) { navActive[item.id] = true }
             }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:无法 在 NavigationLink isActive 参数上将类型 'Binding<Bool?>' 的值转换为预期的参数类型 'Binding<Bool>'

注意:在接收带有 onRecieve 修饰符的 allItems 时,我已经用键值对填充了 navActive 字典

Asp*_*eri 7

这是您的用例的一种可能方法

struct ListView: View {
    
    // ... your view model defined here

    @State private var selectedItem: UUID? = nil
    var body: some View {

        List (viewModel.allItems, id: \.id) { item in
            Text(item.name)
                .onTapGesture {
                    self.selectedItem = item.id
                }
                .background(
                    NavigationLink(destination: DetailView(item), tag: item.id,
                        selection: $selectedItem) { EmptyView() }
                        .buttonStyle(PlainButtonStyle())
                )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)