SwiftUI列表多选与NavigationLink

3
在运行于macOS上的SwiftUI中,对于一个包含NavigationLink的项目列表,多选不起作用。如果完全相同的视图不包括NavigationLink,则可以正常工作。如何在运行于macOS上的同一列表中同时实现多选和NavigationLink?也许这需要一种不与列表绑定的构建NavigationLinks的不同方法?这是否可能?我已经尝试在选择多个行时有条件地禁用NavigationLink,但这没有效果(例如.disabled(selection.count > 1))。以下是多选不起作用的示例(请注意,在按住Shift键单击三次结果时,完整的选择会短暂出现,然后跳到最后点击的项):
struct TestListView: View {
  @State var selection = Set<String>()
  let options = ["a", "b", "c"]

  var body: some View {
    NavigationView {
      List(options, id: \.self, selection: $selection) { item in
        NavigationLink {
          Text(String(describing: selection))
        } label: {
          Text(item)
        }
      }
    }
  }
}

上述代码的屏幕录像

多选正常工作的示例:

struct TestListView: View {
  @State var selection = Set<String>()
  let options = ["a", "b", "c"]

  var body: some View {
    NavigationView {
      List(options, id: \.self, selection: $selection) { item in
        Text(item)
      }
      Text(String(describing: selection))
    }
  }
}

enter image description here

1个回答

1

看起来我在其中一个问题示例中已经解决了它。更复杂的示例中的另一个错误误导了我。解决方案实际上是上面的第二个选项。

换句话说,不要尝试混合使用NavigationLink和多选。而是跳过NavigationLink,并将目标视图放在列表旁边(仅在macOS上测试)。

struct TestListView: View {
  @State var selection = Set<String>()
  let options = ["a", "b", "c"]

  var body: some View {
    NavigationView {
      List(options, id: \.self, selection: $selection) { item in
        Text(item)
      }
      if selection.isEmpty {
        Text("Empty")
      } else if selection.count > 1 {
        Text("Multiple")
      } else if let selection = selection.first {
        Text(selection)
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接