可刷新SWIFTUI(拉入以刷新)在ScrollView中不起作用

xzv2uavs  于 2022-10-23  发布在  Swift
关注(0)|答案(2)|浏览(279)
var body: some View {
        NavigationView {
            ZStack {
                Color(UIColor.systemGroupedBackground).edgesIgnoringSafeArea(.all)
                ScrollView(showsIndicators: false) {
                    if #available(iOS 15.0, *) {
                        VStack {
                            if self.viewModel.forms.isEmpty && !self.viewModel.isLoading {
                                Text("No Forms Assigned")
                                    .foregroundColor(Color.gray)
                                    .padding(.vertical, 20)
                                    .accessibility(label: Text("No forms assigned"))
                            }
                            if self.viewModel.isLoading {
                                ActivityIndicator(isAnimating: .constant(true), style: .large).padding(.top, 20)
                            }
                            noFormsScrollView
                            Spacer(minLength: 16).accessibility(hidden: true)
                        }
                        .refreshable {
                            self.refreshData()
                        }
                    } else {
                        // Fallback on earlier versions
                    }
                }
            }.navigationBarTitle("Forms", displayMode: .inline)
        }
}

我正试着增加拉力来刷新我的ScrollView,但它不起作用。我在想,我到底做错了什么。

o8x7eapl

o8x7eapl1#

只有在使用refreshable时,才能在List上自动使用拉动刷新。要使任何其他视图可刷新,您需要为此编写您自己的处理程序。
This StackOverflow example显示了如何在ScrollView上执行Pull以刷新工作。

2hh7jdfx

2hh7jdfx2#

完整的SwiftUI示例
支持iOS 13+
只需在您的项目中创建RefreshableScrollView

public struct RefreshableScrollView<Content: View>: View {
    var content: Content
    var onRefresh: () -> Void

    public init(content: @escaping () -> Content, onRefresh: @escaping () -> Void) {
        self.content = content()
        self.onRefresh = onRefresh
    }

    public var body: some View {
        List {
            content
                .listRowSeparatorTint(.clear)
                .listRowBackground(Color.clear)
                .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
        }
        .listStyle(.plain)
        .refreshable {
            onRefresh()
        }
    }
}

然后在项目中的任何位置使用RefreshableScrollView
示例:

RefreshableScrollView{
      // Your content
    } onRefresh: {
      // do something you want
    }

相关问题