我正在嘗試使用 ScrollViewReader 滾動到 SwiftUI 串列中新附加的視圖,但在添加了一些專案后,scrollTo(_:) 中的 EXC_BAD_INSTRUCTION 不斷崩潰。我正在使用 Xcode 14.0.1 和 iOS 16.0 模擬器。
這是一個展示該問題的最小演示:
struct ContentView: View {
@State var items = [Item]()
@State var scrollItem: UUID? = nil
var body: some View {
NavigationView {
ScrollViewReader { proxy in
List {
ForEach(items) { item in
Text(item.id.uuidString)
.id(item.id)
}
}
.listStyle(.inset)
.onChange(of: scrollItem) { newValue in
proxy.scrollTo(newValue)
}
}
.navigationTitle("List Demo")
.toolbar {
Button("Add") {
addItem()
}
}
}
}
func addItem() {
items.append(Item())
scrollItem = items.last?.id
}
}
struct Item: Identifiable {
let id = UUID()
}
我可以使用 ScrollView 而不是 List 來解決這個問題,但我想在實際專案中使用本機的滑動洗掉功能。
uj5u.com熱心網友回復:
List
中不支持ScrollViewReader
。看到這個執行緒。
這個解決方案很丑陋,但有效。不好的是,當您添加新專案時,串列會閃爍。我使用了上面執行緒中的一個想法。
import SwiftUI
struct ContentView: View {
@State var items = [Item]()
@State var scrollItem: UUID? = nil
@State var isHidingList = false
var body: some View {
NavigationView {
VStack(alignment: .leading) {
if isHidingList {
list.hidden()
} else {
list
}
}
.onChange(of: scrollItem) { _ in
DispatchQueue.main.async {
self.isHidingList = false
}
}
.navigationTitle("List Demo")
.toolbar {
Button("Add") {
addItem()
}
}
}
}
var list: some View {
ScrollViewReader { proxy in
List {
ForEach(items) { item in
Text(item.id.uuidString)
.id(item.id)
}
}
.listStyle(.inset)
.onChange(of: scrollItem) { newValue in
guard !isHidingList else { return }
proxy.scrollTo(newValue)
}
.onAppear() {
guard !isHidingList else { return }
proxy.scrollTo(scrollItem)
}
}
}
func addItem() {
isHidingList = true
items.append(Item())
scrollItem = items.last?.id
}
}
struct Item: Identifiable {
let id = UUID()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/511912.html
標籤:IOS迅捷swiftui 列表
上一篇:如何在javascript中將xml轉換為二維陣列?
下一篇:WhenselectcelltopassdataalwaysshowsnilinthenextViewControllerusingSwift