简体   繁体   English

如何通过使用 @EnvironmentObject 路由视图导航到项目的详细视图?

[英]How can I navigate to a detail view of an item by using an @EnvironmentObject to route the views?

I have the following code in SwiftUI.我在 SwiftUI 中有以下代码。 I am expecting it to navigate from the list view to the PetView() with the proper name showing when tapping on one of the items in the ForEach loop or the button that says "Go to first pet".我希望它从列表视图导航到 PetView() 并在点击 ForEach 循环中的一个项目或显示“转到第一个宠物”的按钮时显示正确的名称。 However, when I tap on an item or the button, the app doesn't do anything.但是,当我点击某个项目或按钮时,该应用程序不会执行任何操作。 What am I doing wrong?我究竟做错了什么? Thank you for your help!谢谢您的帮助!



import SwiftUI

@main
struct TestListAppApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(ViewRouter())
        }
    }
}



import SwiftUI

struct ContentView: View {
    @EnvironmentObject var viewRouter: ViewRouter

    
    var body: some View {
            
            ForEach(viewRouter.pets) { pet in
                NavigationLink(
                    destination: PetView(),
                    tag: pet,
                    selection: $viewRouter.selectedPet,
                    label: {
                        Text(pet.name)
                    }
                )
            }
            
            Button("Go to first pet.") {
                viewRouter.selectedPet = viewRouter.pets[0]
            }
    
        
}
    
}


import Foundation

class ViewRouter: ObservableObject {
    @Published var selectedPet: Pet? = nil
    @Published var pets: [Pet] = [Pet(name: "Louie"), Pet(name: "Fred"), Pet(name: "Stanley")]
}



import SwiftUI

struct PetView: View {
    
    @EnvironmentObject var viewRouter: ViewRouter

    var body: some View {
        Text(viewRouter.selectedPet!.name)
    }
}

import Foundation

struct Pet: Identifiable, Hashable {
    var name: String
    var id: String { name }

}

try this:试试这个:

@main
struct TestListAppApp: App {
@StateObject var viewRouter = ViewRouter()
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(viewRouter)
        }
    }
}
struct PetView: View {
    @EnvironmentObject var viewRouter: ViewRouter
    
    var body: some View {
        if let pet = viewRouter.selectedPet {
            Text(pet.name)
        } else {
            EmptyView()
        }
    }
}

struct ContentView: View {
    @EnvironmentObject var viewRouter: ViewRouter
    
    var body: some View {
        NavigationView {
            List {
                ForEach(viewRouter.pets) { pet in
                    NavigationLink(destination: PetView(),
                                   tag: pet,
                                   selection: $viewRouter.selectedPet,
                                   label: {
                        Text(pet.name)
                    })
                }
                Button("Go to first pet.") {
                    viewRouter.selectedPet = viewRouter.pets[0]
                }
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用@EnvironmentObject 初始化@State,而不使用.onAppear? - How can I use @EnvironmentObject to initialize @State, without using .onAppear? 使用 EnvironmentObject(按钮和导航视图)切换视图不起作用 - Switching Views using EnvironmentObject (Button and Navigation View) not working 如何导航到不同的视图? - How can I navigate to different views? 我在 SwiftUI 中使用 @EnvironmentObject 并且我得到了这个“View.environmentObject(_:) for ViewModel 可能缺少作为这个视图的祖先”错误 - I'm using @EnvironmentObject in SwiftUI and I got this "View.environmentObject(_:) for ViewModel may be missing as an ancestor of this view" Error 如何使用 Swift 中的 the.environmentObject() 从视图将值传递给 ViewModel? - How do I pass a value to a ViewModel from a View using the .environmentObject() in Swift? 无法使用 @EnvironmentObject SwiftUI 更新先前视图上的文本 - Can't Update Text on Previous View using @EnvironmentObject SwiftUI 在 SwiftUI 中,我可以在不在 SceneDelegate 中传递 @EnvironmentObject 吗? 喜欢在任何视图中传递它 - In SwiftUI, can I pass @EnvironmentObject not in the SceneDelegate? Like pass it in any View 如何使用 SwiftUI 中的按钮在视图之间导航? - How do I navigate between views using a button in SwiftUI? 将 .environmentObject 与作为工作表呈现的视图一起使用会导致 onReceive 不与 @EnvironmentObject 触发/冲突 - Using .environmentObject with a View presented as a sheet causes onReceive not to fire/conflicts with @EnvironmentObject 如何从 SwiftUI 中的 en EnvironmentObject 加载 state? - How can I load state from en EnvironmentObject in SwiftUI?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM