You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI列表无法滚动问题:如何实现列表可滚动?

SwiftUI列表无法滚动的修复方案

可能的问题及解决办法:

  1. 数据源条目不足
    列表仅在内容高度超过容器高度时才会触发滚动。先确认texts数组有足够多的测试数据,比如添加:

    // 在SøkView结构体里添加数据源
    let texts = (1...50).map { "观测条目\($0)" }
    
  2. 导航容器适配问题(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("观测记录")
    }
    
  3. 列表高度被限制
    确保List能够占据足够的垂直空间,添加frame(maxHeight: .infinity)让列表撑满可用区域:

    List {
        // ... 原有代码
    }
    .frame(maxHeight: .infinity)
    .searchable(text: $searchText)
    
  4. 手势冲突
    同时使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:47:25