首页 > 解决方案 > Swift - 在项目周围移动时保留导航视图中的选定项目

问题描述

我正在构建一个带有侧边栏导航视图的 macOS swiftUI 应用程序,它确定屏幕右侧显示的内容。用户可以在侧边栏中的项目周围移动。但是,当一个项目被拖到一个新位置时,navigationView 中的选择会被删除。我想知道如何在移动一个项目后保持选中相同的项目,即使正在移动的项目在选定的项目中也是如此。

这是我的 NavigationView 代码:

NavigationView {
    List() {
        ForEach(instances) { instance in
            NavigationLink(destination: InstanceView(instance: instance), tag: instance, selection: $selectedInstance) {
                InstanceRow(instance: instance).id(UUID())
            }
        }
         .onMove(perform: move)
    }
    .listStyle(SidebarListStyle())
    .navigationTitle("Instances")
    .frame(minWidth: 150)
    .toolbar {
        ToolbarItem {
            Button(action: toggleSidebar, label: {
                Image(systemName: "sidebar.left")
            })
        }
    }
    .onAppear {
        selectedInstance = instances[0]
    }
}

这是我的 move() 函数:

private func move(from source: IndexSet, to destination: Int) {
    var revisedItems: [Instance] = instances.map{$0}

    revisedItems.move(fromOffsets: source, toOffset: destination)
        
    for reverseIndex in stride(from: revisedItems.count - 1, through: 0, by: -1) {
        revisedItems[reverseIndex].userOrder = Int16(reverseIndex)
    }
        
    do {
        try viewContext.save()
    } catch {
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
}

我不确定为什么这会导致 selectedInstance 变为 nil,并且我尝试保存 selectedInstance 的索引并在移动项目后计算它应该是什么,但我对此没有任何运气。那么保留所选侧边栏项目的说法是什么?

谢谢!

标签: swiftswiftuiswiftui-navigationlinkswiftui-navigationview

解决方案


推荐阅读