SwiftUI列表如何在macOS上识别所选项目

3

根据这个答案,我已经有了一些基础代码。目前的代码允许用户选择单元格,但我无法区分所选单元格或执行任何响应选择的代码。简而言之,如何根据所选单元格的名称执行代码并在单击时执行。该单元格当前在点击处以蓝色突出显示,但我想根据所选内容进行标识并作出相应反应。注意:我不想在编辑模式下选择单元格。另外,如何通过编程方式选择单元格而无需单击?

struct OtherView: View {
    @State var list: [String]
    @State var selectKeeper = Set<String>()

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

这是一个演示选择的gif:

5个回答

5
我找到了一个解决方法,但必须点击文本本身- 点击单元格没有任何作用:
struct OtherView: View {
    @State var list: [String]
    @State var selectKeeper = Set<String>()

    var body: some View {
        NavigationView {
            List(list, id: \.self, selection: $selectKeeper) { item in
                Text(item)
                  .onTapGesture {
                     print(item)
                  }
            }
        }
    }
}

1

您可以通过在选择变量上使用 onChange 来对所选项目做出反应。

您可以通过简单地设置变量来手动设置选择。这也会触发 onChange

以下是一些示例代码,可直接在Playgrounds中运行:

import SwiftUI
import PlaygroundSupport

struct OtherView: View {
    @State var list: [String] = ["a", "b", "c"]
    @State var selection: String?

    var body: some View {
        NavigationView {
            VStack {
                List(list, id: \.self, selection: $selection) { item in
                    Text(item)
                }
                .onChange(of: selection) {s in
                    // React to changes here
                    print(s)
                }
                
                Button("Select b") {
                    // Example of setting selection programmatically
                    selection = "b"
                }
            }
        }
    }
}

let view = OtherView()
PlaygroundPage.current.setLiveView(view)

0

问题明确要求在 macOS 上实施,而不是在 iOS 上实施。 - undefined
我的错,但是:1)一个简单的#if os(iOS)....就可以解决问题,2)我修复了GIST。所以请看一下并点赞。 - undefined

0
列表选择在编辑模式下工作,所以这里是一些关于选择用法的演示。

demo

struct OtherView: View {
    @State var list: [String] = ["Phil Swanson", "Karen Gibbons", "Grant Kilman", "Wanda Green"]
    @State var selectKeeper = Set<String>()

    var body: some View {
        NavigationView {
            List(list, id: \.self, selection: $selectKeeper) { item in
                if self.selectKeeper.contains(item) {
                    Text(item).bold()
                } else {
                    Text(item)
                }
            }.navigationBarItems(trailing: HStack {
                if self.selectKeeper.count != 0 {
                    Button("Send") {
                        print("Sending selected... \(self.selectKeeper)")
                    }
                }
                EditButton()
            })
        }
    }
}

1
唯一的问题是,在macOS上,.navigationBarItems在SwiftUI上不起作用。 - undefined

0

为了节省你的劳动痛苦:

import SwiftUI

struct ContentView: View {
    @State private var selection: String?
    let list: [String] = ["First", "Second", "Third"]
    
    var body: some View {
        NavigationView {
            HStack {
                List(selection: $selection) {
                    ForEach(list, id: \.self) { item in
                        VStack {
                            Text(item)
                        }
                    }
                }
                TextField("Option", text: Binding(self.$selection) ?? .constant(""))
            }
            .frame(minWidth: 100, maxWidth: .infinity, minHeight: 100, maxHeight: .infinity)
        }
    }
}

这个解决方案处理了@Isaac提到的问题。 截图

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