SwiftUI-将列表滚动到由外部变量控制的特定元素
我有一个由核心数据填充的列表,如下所示:SwiftUI-将列表滚动到由外部变量控制的特定元素,swift,swiftui,swiftui-list,Swift,Swiftui,Swiftui List,我有一个由核心数据填充的列表,如下所示: @EnvironmentObject var globalVariables : GlobalVariables @Environment(\.managedObjectContext) private var coreDataContext @FetchRequest(fetchRequest: Expressao.getAllItemsRequest()) private var allItems: FetchedResults<Expres
@EnvironmentObject var globalVariables : GlobalVariables
@Environment(\.managedObjectContext) private var coreDataContext
@FetchRequest(fetchRequest: Expressao.getAllItemsRequest())
private var allItems: FetchedResults<Expressao>
var body: some View {
ScrollViewReader { proxy in
List {
ForEach(allItems,
id: \.self) { item in
Text(item.term!.lowercased())
.id(allItems.firstIndex(of:item))
.listRowBackground(
Group {
if (globalVariables.selectedItem == nil) {
Color(UIColor.clear)
} else if item == globalVariables.selectedItem {
Color.orange.mask(RoundedRectangle(cornerRadius: 20))
} else {
nextAlternatedColor(item:item)
}
}
}
}
}
}
}
@EnvironmentObject var globalVariables:globalVariables
@环境(\.managedObjectContext)私有变量coreDataContext
@FetchRequest(FetchRequest:Expressao.getAllItemsRequest())
私有变量allItems:FetchedResults
var body:一些观点{
ScrollViewReader{中的代理
名单{
ForEach(allItems,
id:\.self){中的项
文本(item.term!.lowercased())
.id(所有项目的第一个索引)
.listRowBackground(
团体{
if(globalVariables.selectedItem==nil){
颜色(UIColor.clear)
}如果item==globalVariables.selectedItem,则为else{
颜色.橙色.遮罩(圆角半径:20))
}否则{
nextAlternatedColor(项目:项目)
}
}
}
}
}
}
}
每次选择一行时,它都会将颜色更改为橙色。因此,您可以看到颜色由位于globalVariables中的外部变量控制。selectedItem
我希望能够使列表滚动到globalVariables上的该元素。自动选择editem
如何使用ScrollViewReader
有什么想法吗?这里是一个可能方法的演示-
scrollTo
只能在闭包中使用,因此想法是根据要滚动到的行创建一些背景视图(这可以通过.id
实现),并在中附加put.scrollTo
。在该视图的外观上
使用Xcode 12/iOS 14进行测试
struct DemoView: View {
@State private var row = 0
var body: some View {
VStack {
// button here is generator of external selection
Button("Go \(row)") { row = Int.random(in: 0..<50) }
ScrollViewReader { proxy in
List {
ForEach(0..<50) { item in
Text("Item \(item)")
.id(item)
}
}
.background( // << start !!
Color.clear
.onAppear {
withAnimation {
proxy.scrollTo(row, anchor: .top)
}
}.id(row)
) // >> end !!
}
}
}
}
struct DemoView:View{
@国家私有变量行=0
var body:一些观点{
VStack{
//这里的按钮是外部选择的生成器
按钮(“转到\(行)”{row=Int.random(在:0中..出于某种原因,这样做会使CPU急剧上升。现在,滚动列表会使CPU峰值达到100%。选择一行很慢…嗯…在提供的演示上?在这里工作很好…有时会瞬间达到30%,但通常不会超过5%。好的,我已经设法摆脱了100%的CPU问题。现在,像你一样,我看到峰值有时达到30%50%如果我快速滚动列表。我认为SwiftUI有一个问题。无论如何,我会接受你的答案并进行更多研究。