Swift - 移动项目时在导航视图中保留所选项目

时间:2021-06-25 06:15:43

标签: swift swiftui swiftui-navigationlink swiftui-navigationview

我正在构建一个带有侧边栏导航视图的 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 的索引并计算移动项目后它应该是什么,但我对此没有任何运气.那么保留所选侧边栏项目的说法是什么?

谢谢!

0 个答案:

没有答案