首页 > 解决方案 > SwiftUI TextEditor:在文本更改时滚动到顶部

问题描述

我正在使用 SwiftUI 2 的新 TextEditor。我想做的是 TextEditor 在文本更改时自动滚动到顶部,而目前情况并非如此。

文本的动画 gif 更改而不会自动滚动到顶部

这是示例项目的代码:

import SwiftUI

struct ContentView: View {
    @State private var text: String = Self.text1
    
    static private var text1 = """
Text 1:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"""
    
    static private var text2 = """
Text 2:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"""
    
    var body: some View {
        VStack {
            TextEditor(text: $text)
                .frame(maxHeight: 150)
            Button("Toggle Text") {
                if text == Self.text1 {
                    text = Self.text2
                } else {
                    text = Self.text1
                }
            }
        }
        
    }
}

我发现一些关于 ScrollView 的线程没有帮助,但在 TextEditor 上找不到任何内容。

标签: swiftui

解决方案


这是使用 ScrollViewReader for SwiftUI 2.0 和 ScrollView 的可能解决方案

var body: some View {
    ScrollViewReader { sp in
        ScrollView {
            TextEditor(text: $text)
                .id(0)
        }.frame(maxHeight: 150)

        Button("Toggle Text") {
            if text == Self.text1 {
                text = Self.text2
                sp.scrollTo(0, anchor: .top)
            } else {
                text = Self.text1
                sp.scrollTo(0, anchor: .top)
            }
        }
    }
}

推荐阅读