SwiftUI列表无法滚动问题:如何实现列表可滚动?
SwiftUI列表无法滚动的修复方案
可能的问题及解决办法:
数据源条目不足
列表仅在内容高度超过容器高度时才会触发滚动。先确认texts数组有足够多的测试数据,比如添加:// 在SøkView结构体里添加数据源 let texts = (1...50).map { "观测条目\($0)" }导航容器适配问题(iOS16+)
旧的NavigationView在iOS16及以上版本的布局中可能存在兼容性问题,替换为官方推荐的NavigationStack:// 替换原NavigationView代码 NavigationStack { List { ForEach(search(texts: texts, for: searchText), id: \.self) { text in Text(text) .contextMenu { Button { UIPasteboard.general.string = text } label: { Text("复制") Image(systemName: "doc.on.doc") } } .onLongPressGesture(priority: .low) { print("长按触发:\(text)") } } } .searchable(text: $searchText) .navigationTitle("观测记录") }列表高度被限制
确保List能够占据足够的垂直空间,添加frame(maxHeight: .infinity)让列表撑满可用区域:List { // ... 原有代码 } .frame(maxHeight: .infinity) .searchable(text: $searchText)手势冲突
同时使用contextMenu和onLongPressGesture会引发手势优先级冲突,干扰滚动。可以给长按手势设置低优先级,或者暂时移除长按手势测试:Text(text) .contextMenu { // ... 复制按钮代码 } .onLongPressGesture(priority: .low) { print("长按触发:\(text)") }
完整修改后的代码示例:
import SwiftUI struct SøkView: View { @State private var searchText = "" // 添加测试数据源 let texts = (1...50).map { "观测条目\($0)" } var body: some View { NavigationStack { List { ForEach(search(texts: texts, for: searchText), id: \.self) { text in Text(text) .contextMenu { Button { UIPasteboard.general.string = text } label: { Text("复制") Image(systemName: "doc.on.doc") } } .onLongPressGesture(priority: .low) { print("长按触发:\(text)") } } } .frame(maxHeight: .infinity) .searchable(text: $searchText) .navigationTitle("观测记录") } } func search(texts: [String], for searchText: String) -> [String] { if searchText.isEmpty { return texts } else { return texts.filter { $0.localizedCaseInsensitiveContains(searchText) } } } }
内容的提问来源于stack exchange,提问作者Rubne
相关产品推荐
相关产品推荐

