SwiftUI中如何阻止嵌套ScrollView继承父视图的refreshable修饰符
解决方法
方法一:将refreshable仅绑定到父ScrollView
把原来附加在整个View外层的.refreshable修饰符,移到父ScrollView的后面,这样只有父ScrollView会响应下拉刷新,Sheet内的ScrollView不会继承这个行为。
修改后的完整代码:
struct ContentView: View { @State var showSheet = false var body: some View { ScrollView { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundColor(.accentColor) Button("Hello, world!") { showSheet = true } } .padding() } .refreshable { // 在这里编写父ScrollView的刷新逻辑 } .sheet(isPresented: $showSheet) { ScrollView { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundColor(.accentColor) Text("Hello, world!") } .padding() } .presentationDetents([.medium, .large]) } } }
方法二:给嵌套ScrollView添加空的refreshable覆盖
如果无法调整父refreshable的位置,可以给Sheet内的ScrollView添加一个空的.refreshable修饰符,这样下拉嵌套ScrollView时会触发这个空实现,不会调用父级的刷新逻辑。
修改后的Sheet部分代码:
.sheet(isPresented: $showSheet) { ScrollView { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundColor(.accentColor) Text("Hello, world!") } .padding() } .refreshable {} // 添加空的refreshable覆盖父级行为 .presentationDetents([.medium, .large]) }
问题根源:你之前把.refreshable附加到了包含Sheet的整个外层View上,导致所有子视图中的ScrollView都会继承这个刷新行为。通过上述两种方式,可以精准控制refreshable的作用范围,避免嵌套ScrollView误触发父级刷新。
内容的提问来源于stack exchange,提问作者Berry Blue
相关产品推荐
相关产品推荐

