【问题标题】:How can I navigate to a detail view of an item by using an @EnvironmentObject to route the views?如何通过使用 @EnvironmentObject 来路由视图来导航到项目的详细视图?
【发布时间】:2021-06-26 05:07:19
【问题描述】:

我在 SwiftUI 中有以下代码。我希望它从列表视图导航到 PetView(),并在点击 ForEach 循环中的一个项目或显示“转到第一个宠物”的按钮时显示正确的名称。但是,当我点击某个项目或按钮时,该应用程序不会执行任何操作。我究竟做错了什么?感谢您的帮助!



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 }

}

【问题讨论】:

    标签: swiftui swiftui-list swiftui-navigationlink


    【解决方案1】:

    试试这个:

    @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]
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多