SwiftUI 列表 didSelect 就像 UITableView 中一样

Sal*_*500 7 ios swiftui

我有一个显示国家/地区图像、名称和电话代码的列表,我想知道选择了哪个国家/地区,就像UITableView中一样 didSelectRowAt indexPath

语言环境信息

struct LocaleInfo: Codable, Identifiable {
    let id = UUID()
    let name: String
    let dialCode: String
    let code: String

    var flag: UIImage? {
        return UIImage(named: "Countries.bundle/Images/\(code.uppercased())", in: Bundle.main, compatibleWith: nil)
    }

}
Run Code Online (Sandbox Code Playgroud)

斯威夫特用户界面

List(filterLocaleInfo.filter({ $0.name.hasPrefix(search) })) { info in
            HStack(alignment: .center) {
                Image(uiImage: info.flag ?? UIImage())
                VStack(alignment: .leading) {
                    Text(info.name)
                        .font(.custom("Avenir-Medium", size: 17))

                    Text(info.dialCode)
                        .font(.custom("Avenir-Book", size: 15))
                }
            }
        }
        .onAppear { self.getLocaleData() }
Run Code Online (Sandbox Code Playgroud)

iSp*_*n17 5

SwiftUI 没有 didSelectRowAt 或类似的东西,因为它使用状态而不是标准事件处理程序来进行更改。

您应该定义一个@State变量来跟踪当前选定的值:

@State private var selectedLocale: LocaleInfo? = nil
Run Code Online (Sandbox Code Playgroud)

然后使用init(_:selection:rowContent)构造函数:

List(filterLocaleInfo.filter({ $0.name.hasPrefix(search) }), selection: $selectedLocale) { info in
            HStack(alignment: .center) {
                Image(uiImage: info.flag ?? UIImage())
                VStack(alignment: .leading) {
                    Text(info.name)
                        .font(.custom("Avenir-Medium", size: 17))

                    Text(info.dialCode)
                        .font(.custom("Avenir-Book", size: 15))
                }
            }
        }
        .onAppear { self.getLocaleData() }
Run Code Online (Sandbox Code Playgroud)

其中$变量前面的符号表示您将@State变量绑定到列表的选择值,这意味着该selectedLocale变量将始终包含当前选定的区域设置,并且每当此状态变量发生变化时,整个视图将被重新计算(假设您实际使用此值)状态变量在其他地方 - 例如在if语句中)。