SwiftUI中可选自定义类型作为List选中项时无法正常工作
请提供需要进行格式化的具体内容,我会按照你指定的Markdown格式规则完成格式整理。
如果是针对你之前提出的SwiftUI列表选中问题,整理后的标准Stack Overflow风格回答如下:
问题原因及修复方案
你的列表选中功能失效,核心问题是标签(tag)的类型与选中绑定变量(selection)的类型不匹配。
具体分析
你定义的selection是Message?类型,但给列表项设置的标签是message as Message?——这种强制将标签包装成可选类型的操作,会导致SwiftUI无法正确匹配选中项的标签值与selection的类型,进而使选中逻辑失效。
而当你把selection改为UUID?类型时,对应的标签用的是message.id(非可选的UUID类型),SwiftUI能自动将标签值包装成可选类型赋值给selection,所以功能正常。
修复后的代码
只需要将列表项的标签设置改为非可选的Message类型即可:
struct Message: Identifiable, Hashable { let id = UUID() let content: String } struct ContentView: View { @State private var selection: Message? @State private var messages: [Message] = [ Message(content: "Hello"), Message(content: "World") ] var body: some View { NavigationStack { List(selection: $selection) { ForEach(messages) { message in Text(message.content) .tag(message) // 移除多余的可选类型转换 } } .navigationTitle("List") }.onChange(of: selection) { oldValue, newValue in print("Old value \(String(describing: oldValue))") print("New value \(String(describing: newValue))") } } }
补充说明
由于Message已经通过Identifiable协议自动合成了Hashable实现(因为id是UUID类型,本身支持Hashable),所以直接使用message作为标签完全符合SwiftUI对选中功能的要求。
内容的提问来源于stack exchange,提问作者Whirlwind
相关产品推荐
相关产品推荐

