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