我有以下視圖,我試圖讓它在點擊按鈕時滾動到底部,因為元素被添加到串列中。我搜索了一下,發現 ScrollViewReader 是可以使用的選項,但是我的實作似乎并不奏效。
我的修復嘗試包括在內部視圖和外部 HStack{} 上明確設定單元格的 id,我甚至嘗試將 id 設定為自身的參考,我知道這是一個壞主意,但為了簡潔起見。我還洗掉了串列中的任何額外的視圖,如HStack{},Spacer()等,只留下我的ColorsChosenView().id(i),認為額外的視圖可能會導致它,但我想說,問題仍然存在。
var body。some View {
VStack {
ScrollViewReader { reader in
List {
ForEach(0.<vm.guesses.count, id: .self) { i 在中
HStack{
Spacer()
ColorsChosenView(locationCorrect: 1,
locationIncorrect: 3。
color1: vm.guesses[i][0] 。
color2: vm.guesses[i][1]。
color3: vm.guesses[i][2]。
color4: vm.guesses[i][3])
Spacer()
}.id(i)
}
}.listStyle(InsetListStyle()
Divider()
.frame(maxWidth: 250)
ColorChoicePicker(vm: vm)
Divider()
.frame(maxWidth: 250)
HStack {
Spacer()
FABButton(text: "SUBMIT")
.onTapGesture {
vm.submit()
reader.scrollTo(vm.guesses.count - 1)
}
}.padding()
}
}
.navigationBarHidden(true)
.navigationBarHidden(true)
.onAppear(執行。{
vm.resetGame()
})
}
為了簡化事情,我發現這樣做就可以了。然而,我的實作并不覺得有什么不同。
var body。some View {
ScrollViewReader { proxy in
VStack {
Button("Jump to #50") {
proxy.scrollTo(50)
}
List(0...<100, id: .self) { i in
Text(" Example (i)")
.id(i)
}
}
}
}
uj5u.com熱心網友回復:
既然你在修改陣列,這應該是可行的:
1:在主執行緒中呼叫該函式(DispatchQueen.main.async)
-> 這將 "有點 "作用,它將滾動,但不是滾動到當前,而是滾動到之前的最后一個專案
2: (Workaround) 在變化處理程式中處理滾動(如果所有的變化都應該使它滾動到底部,你也可以洗掉shouldScroll變數)
class NumbersContainer: ObservableObject {
@Published var numbers: [Int] = Array(0.<25)
func submit() {
self.numbers.append(self.numbers.count)
}
}
struct ContentView: View {
@StateObject var nc = NumbersContainer()
@State var shouldScroll: Bool = false
var body。some View {
VStack {
ScrollViewReader { reader in
Button("提交", action: {
DispatchQueue.main.async {
nc.submit()
}
self.shouldScroll = true。
})
List {
ForEach(0.<nc.numbers.count, id: .self) { i 在中
HStack {
Spacer()
Text("Row (i)")
Spacer()
}.id(i)
}
}
.onChange(of: nc.numbers) { newValuein
if shouldScroll {
reader.scrollTo(newValue.count - 1)
shouldScroll = false
}
}
}
}
}
}
另一種可能性是使用ScrollReaderProxy作為提交函式的引數:
class NumbersContainer: ObservableObject {
var numbers: [Int] = Array(0.<25)
func submit(reader: ScrollViewProxy) {
let dispatchGroup = DispatchGroup()
dispatchGroup.enter() //所有葉子都必須有一個enter。
DispatchQueue.main.async {
self.numbers.append(self.numbers.count)
DispatchGroup.leave() //通知DispatchGroup。
}
dispatchGroup.notify(queue: .main) {
reader.scrollTo(self.numbers.count - 1)
}
}
}
struct ContentView: View {
var nc = NumbersContainer()
var body。some View {
VStack {
ScrollViewReader { reader in
Button("提交", action: {
nc.submit(reader: reader)
})
List {
ForEach(0.<nc.numbers.count, id: .self) { i 在中
HStack {
Spacer()
Text("Row (i)")
Spacer()
}.id(i)
}
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/325712.html
標籤:
上一篇:在Python中對嵌套的串列進行排序時,不作業是真的嗎?
下一篇:有條件地使用影像
