SwiftUI中为List添加Context Menu后长按列表消失问题求助
你遇到的问题是因为直接给整个List添加contextMenu时,和List本身的行级交互逻辑产生冲突,导致长按出现视觉异常(列表消失/全屏幕选中的假象)。Grid组件因交互逻辑不同无此问题,但仅支持iOS16+,要兼容低版本,正确做法是给每个列表项单独添加ContextMenu,而非给整个List添加。
修改方案一:给单个列表项添加ContextMenu
将contextMenu从List移至每个ItemView上:
import SwiftUI struct SwiftUIView: View { var body: some View { List { ItemView() .contextMenu { Button(action: { // 实现当前行的复制逻辑 UIPasteboard.general.string = "Column 1 Column 2 Column 3" }){ Text("Copy") } } ItemView() .contextMenu { Button(action: { UIPasteboard.general.string = "Column 1 Column 2 Column 3" }){ Text("Copy") } } ItemView() .contextMenu { Button(action: { UIPasteboard.general.string = "Column 1 Column 2 Column 3" }){ Text("Copy") } } } } } struct ItemView: View { var body: some View { HStack{ Text("Column 1") Spacer() Text("Column 2") Spacer() Text("Column 3") } } } struct SwiftUIView_Previews: PreviewProvider { static var previews: some View { SwiftUIView() } }
修改方案二:将ContextMenu整合到ItemView中
若每个列表项的ContextMenu逻辑一致,直接把contextMenu写入ItemView,代码更简洁:
import SwiftUI struct SwiftUIView: View { var body: some View { List { ItemView() ItemView() ItemView() } } } struct ItemView: View { // 可添加数据属性,动态获取行内容 var col1 = "Column 1" var col2 = "Column 2" var col3 = "Column 3" var body: some View { HStack{ Text(col1) Spacer() Text(col2) Spacer() Text(col3) } .contextMenu { Button(action: { // 复制当前行所有内容 let copyText = "\(col1) | \(col2) | \(col3)" UIPasteboard.general.string = copyText }){ Text("Copy") } } } } struct SwiftUIView_Previews: PreviewProvider { static var previews: some View { SwiftUIView() } }
效果说明
修改后,长按单个列表项会正常弹出ContextMenu,不会出现列表消失的异常,同时兼容iOS16以下系统版本。若需批量操作的ContextMenu,可在List外层套VStack并给VStack添加ContextMenu,但表格复制操作通常针对单行更合理。
内容的提问来源于stack exchange,提问作者BPDev
相关产品推荐
相关产品推荐

