【问题标题】:Make a list scroll to bottom with SwiftUI使用 SwiftUI 使列表滚动到底部
【发布时间】:2020-01-19 02:06:57
【问题描述】:

我有一个列表,当我插入一个项目时,我希望列表在我的@ObservedObject 更改时自动滚动到底部。

有我的实际查看代码:

struct DialogView: View {

    @ObservedObject var viewModel = DialogViewModel()

    var body: some View {
            List {
                ForEach(self.viewModel.discussion, id: \.uuid) {
                    Text($0.content)
                }
            }.animation(Animation.easeOut)


    }
}

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    SwiftUI 2.0

    现在使用 Xcode 12 / iOS 14 可以在 ScrollViewLazyVStack 中使用 ScrollViewReader/ScrollViewProxy 解决(用于性能、行重用等),如下所示

    struct DialogView: View {
    
        @ObservedObject var viewModel = DialogViewModel()
    
        var body: some View {
            ScrollView {
                ScrollViewReader { sp in
                    LazyVStack {
                        ForEach(self.viewModel.discussion, id: \.uuid) {
                            Text($0.content).id($0.uuid)
                        }
                    }
                    .onReceive(viewModel.$discussion) { _ in
                        guard !viewModel.discussion.isEmpty else { return }
    
                        withAnimation(Animation.easeInOut) {
                            sp.scrollTo(viewModel.discussion.last!.uuid)
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 嘿@Asperi,您是否可以使用常规数组而不是包裹在ObservableObject 中的数组来执行此操作?我的视图只是在其初始化程序中注入了一个数组,因此常规数组不符合 Publisher。我尝试使用@Binding 定义它,但这似乎没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2022-01-22
    • 1970-01-01
    • 2021-12-24
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多