SwiftUI -导航链接多次打开同一视图



我有一个列表在ViewA有3行。ViewA是主视图的孙子(不确定这个信息是否重要,但只是提供,因为我不知道实际的bug在哪里。)下面是堆栈是怎样的ContentView ->打开主菜单视图(MMV) ->从MMV中选择一个项目,它会打开->设置视图->从"设置"中选择一个项目,它将打开"视图"。

当我点击ViewA中的一行时,另一个视图会打开比如说ViewB。然而,我看到ViewB实例化了3次,也就是说,我看到ViewB在屏幕上出现了3次,然后在最后一次实例时停止。

我不确定为什么会发生这种情况,以及实际的错误是什么。下面是我的代码:

ViewA (MenuViewOptions):

struct MenuViewOptions: View {
@State var destination: MenuViewType?
var isActive: Binding<Bool> { Binding(get: { destination != nil }, set: { _ in destination = nil } ) }

var body: some View {
VStack {
List(SettingsOptions().menuViewSettingsOptions) { item in
NavigationLink(isActive: isActive, destination: {destination?.view} ) {
MenuViewOptionRowView(menuViewItem: item, destination: $destination)
}
}
}.navigationBarTitle("Settings")
}
}

MenuViewType代码:

enum MenuViewType: Int, CaseIterable, Hashable {
case circularGrid = 0, regularList = 1, capsuleGrid = 2

@ViewBuilder var view: some View {
switch self {
case .circularGrid: MainMenuCircularGridViewNew()
case .regularList: MainMenuListView()
case .capsuleGrid: MainMenuCapsuleGridView()
}
}
}

SettingsOptions()。menuViewSettingsOptions代码:

struct SettingsOptions {
// View inside menu view settings
let menuViewSettingsOptions: [MenuViewSettingsItem] = [
MenuViewSettingsItem(id: 0, name: "Circular Grid", imageName: "circle.grid.2x2", isSelected: false),
MenuViewSettingsItem(id: 1, name: "List", imageName: "list.dash", isSelected: false),
MenuViewSettingsItem(id: 2, name: "Capsule Grid", imageName: "rectangle.grid.2x2", isSelected: false),
]
}

MenuViewOptionRowView代码

struct MenuViewOptionRowView: View {

let menuViewItem: MenuViewSettingsItem
@ObservedObject var userSettingsStore = UserSettingsStore()
@Binding var destination: MenuViewType?
var body: some View {
HStack {
Image(systemName: menuViewItem.imageName)
.circularImageStyle(width: 15, height: 15, padding: 5, backgroundColor: Color(red: 34 / 255, green: 34 / 255, blue: 34 / 255), foregroundColor: Color(red: 23 / 255, green: 121 / 255, blue: 232 / 255))
Text(menuViewItem.name)
Spacer()
if menuViewItem.id == userSettingsStore.menuViewSelection {
Image(systemName: "checkmark").foregroundColor(Color(red: 23 / 255, green: 121 / 255, blue: 232 / 255))
}
}.onTapGesture {
userSettingsStore.menuViewSelection = self.menuViewItem.id
destination = MenuViewType(rawValue: self.menuViewItem.id)
}
}
}

基本上我在MenuViewOptionRowView中设置目的地,一旦它被设置,MenuViewOptions中的isActive变为true并且NavigationLink被触发。我看到行导航到正确的视图,但只是视图实例化3次,我不确定是否因为我在列表中有3行。

如果你知道是什么问题,请告诉我。SwiftUI新功能

谢谢!

您设置了一次目的地,但这样您就激活了List中的所有链接,因为它们都绑定到一个isActive

对于这样的代码设计,我会提出以下解决方案:一个目的地-一个链接,目的地已经设置在tap上,所以…(有问题的代码是不可测试的,所以就按原样)
List(SettingsOptions().menuViewSettingsOptions) { item in
MenuViewOptionRowView(menuViewItem: item, destination: $destination)
}
.background(
NavigationLink(isActive: isActive, destination: {destination?.view} ) {
EmptyView()
}
)

最新更新