Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI-将列表滚动到由外部变量控制的特定元素_Swift_Swiftui_Swiftui List - Fatal编程技术网

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有一个问题。无论如何,我会接受你的答案并进行更多研究。