【问题标题】:Save SwiftUI List selection using @AppStorage in a Mac app在 Mac 应用程序中使用 @AppStorage 保存 SwiftUI 列表选择
【发布时间】:2021-11-24 21:28:54
【问题描述】:

在 Mac 应用程序中,我正在尝试使用 AppStorage 存储 SwiftUI 列表选择。目标是让应用记住最后一次选择,以便在应用重新启动时选择它。我不知道如何将选择绑定到 AppStorage 属性。关于如何完成此任务的任何建议?

enum Fruit: String, CaseIterable, Identifiable {
    case apple
    case orange
    case mango
    case lemon
    var id: String { rawValue }
}

struct Sidebar: View {

    @Binding var selection: Fruit

    var body: some View {
        List(Fruit.allCases, id: \.self, selection: $selection) { fruit in
            Text(fruit.rawValue)
        }
        .listStyle(SidebarListStyle())
        .frame(minWidth: 150)
    }
}

struct DetailView: View {

    var selection: Fruit

    var body: some View {
        switch selection {
        case .apple:
            Text("???? \(selection.rawValue)").font(.title).frame(minWidth: 200)
        case .orange:
            Text("???? \(selection.rawValue)").font(.title).frame(minWidth: 200)
        case .mango:
            Text("???? \(selection.rawValue)").font(.title).frame(minWidth: 200)
        case .lemon:
            Text("???? \(selection.rawValue)").font(.title).frame(minWidth: 200)
        }
    }
}

struct ContentView: View {
    
    @AppStorage("selection") private var selection: Fruit = .apple

    var body: some View {
        NavigationView {
            Sidebar(selection: $selection)
            DetailView(selection: selection)
        }
        .frame(width: 500, height: 300)
    }
}

【问题讨论】:

  • 在侧边栏视图中尝试 onTapGesture selection = fruit 。我很确定您不能像使用选择器选择那样使用列表选择。
  • 您可以在List 中添加可选选项。见List。但是,该列表并未将直接的@AppStorage 作为直接绑定。你的方法是解决这个问题的简单方法......

标签: swift macos swiftui


【解决方案1】:

在选择中使用自定义绑定。

struct Sidebar: View {
    
    @Binding var selection: Fruit

    var body: some View {
        List(Fruit.allCases, id: \.self, selection: Binding($selection)) { fruit in
            Text(fruit.rawValue)
        }
        .listStyle(SidebarListStyle())
        .frame(minWidth: 150)
    }
}

List(Fruit.allCases, id: \.self, selection: Binding(get: {selection}, set: {selection = $0 ?? Fruit.apple}$selection)) {

【讨论】:

  • 为什么不使用Binding($selection)
  • @wigging 是的。这是一个替代方案。但你的想法是对的吗?
  • 您能否将Binding($selection) 方法添加到您的答案中?只是为了让其他人知道。
  • 我的意思是你在你的答案中展示了这两种方法。这样人们就知道解决问题的两种方法。所以也请出示你原来的答案。
【解决方案2】:

您的Binding 没有任何问题。您只需要一种选择不同水果的方法:

    List(Fruit.allCases, id: \.self) { fruit in
        Text(fruit.rawValue)
            .onTapGesture {
                selection = fruit
            }
    }

否则,它适用于您的编码。

我不确定你是怎么做到的,但这里有一个视频: Screen Recording 2021-10-04 at 11.10.29 AM(720)

【讨论】:

  • 这不起作用。它从 List 中删除 $selection 绑定,因此所选项目不会更新。
  • 已在 Xcode 13RC 和 MacOS 11.6 上测试。
  • 我也在 macOS 11.6 上使用了 Xcode 13,但列表选择不起作用。如果没有List(selection:) 那么如何更新列表状态?在您的示例中,selection 更新视图的绑定,而不是列表。
  • 更新了视频显示它正在工作。
  • 在您的视频中,当您选择项目时,侧边栏项目不会突出显示,因为列表的选择状态未更新。这是一个工作示例的图像pasteboard.co/pJsuXvA8Sgop.png
猜你喜欢
  • 2022-08-23
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2018-01-21
  • 2022-01-26
  • 2020-04-03
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多