Swiftui 如何设置 EnvironmentObject 表单 NavigationLink
Switfui How set EnviromentObject from NavigationLink
我想在 View 2
中显示我在 View 1
中选择的元素。我写了这个简单的代码,但它不起作用,因为我无法理解如何在 NavigationLink
中设置 dataStore
。任何人都可以更正代码以使其工作吗?
import SwiftUI
class DataStore: ObservableObject {
@Published var itemNumber = 0
}
struct ContentView: View {
@EnvironmentObject var dataStore:DataStore
var body: some View {
TabView {
// First View Tab
NavigationView {
List(0..<5) { item in
NavigationLink(destination: DetailView().environmentObject(self.dataStore)) {
Text("Item: \(item)")
}
}
}
.tabItem {
Text("View 1")
}
// Second View Tab
Text("This is the item selected in View Tab 1: \(dataStore.itemNumber)")
.tabItem {
Text("View 2")
}
}
}
}
struct DetailView:View {
@EnvironmentObject var dataStore:DataStore
var body: some View {
Text("Item: \(dataStore.itemNumber)")
}
}
在 SceneDelegate
中我将 dataStore
设置为 environmentObject
:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var dataStore = DataStore()
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView()
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(dataStore))
self.window = window
window.makeKeyAndVisible()
}
}
}
如果您需要依赖项,请找到进行依赖项注入的位置。
这是可能的方法。使用 Xcode 11.4 / iOS 13.4
测试
struct ContentView: View {
@EnvironmentObject var dataStore:DataStore
var body: some View {
TabView {
// First View Tab
NavigationView {
List(0..<5) { item in
NavigationLink(destination: DetailView(item: item)) {
Text("Item: \(item)")
}
}
}
.tabItem {
Text("View 1")
}
// Second View Tab
Text("This is the item selected in View Tab 1: \(dataStore.itemNumber)")
.tabItem {
Text("View 2")
}
}
}
}
struct DetailView:View {
let item: Int
@EnvironmentObject var dataStore:DataStore
var body: some View {
Text("Item: \(dataStore.itemNumber)")
.onAppear {
self.dataStore.itemNumber = self.item
}
}
}
我想在 View 2
中显示我在 View 1
中选择的元素。我写了这个简单的代码,但它不起作用,因为我无法理解如何在 NavigationLink
中设置 dataStore
。任何人都可以更正代码以使其工作吗?
import SwiftUI
class DataStore: ObservableObject {
@Published var itemNumber = 0
}
struct ContentView: View {
@EnvironmentObject var dataStore:DataStore
var body: some View {
TabView {
// First View Tab
NavigationView {
List(0..<5) { item in
NavigationLink(destination: DetailView().environmentObject(self.dataStore)) {
Text("Item: \(item)")
}
}
}
.tabItem {
Text("View 1")
}
// Second View Tab
Text("This is the item selected in View Tab 1: \(dataStore.itemNumber)")
.tabItem {
Text("View 2")
}
}
}
}
struct DetailView:View {
@EnvironmentObject var dataStore:DataStore
var body: some View {
Text("Item: \(dataStore.itemNumber)")
}
}
在 SceneDelegate
中我将 dataStore
设置为 environmentObject
:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var dataStore = DataStore()
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView()
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(dataStore))
self.window = window
window.makeKeyAndVisible()
}
}
}
如果您需要依赖项,请找到进行依赖项注入的位置。
这是可能的方法。使用 Xcode 11.4 / iOS 13.4
测试struct ContentView: View {
@EnvironmentObject var dataStore:DataStore
var body: some View {
TabView {
// First View Tab
NavigationView {
List(0..<5) { item in
NavigationLink(destination: DetailView(item: item)) {
Text("Item: \(item)")
}
}
}
.tabItem {
Text("View 1")
}
// Second View Tab
Text("This is the item selected in View Tab 1: \(dataStore.itemNumber)")
.tabItem {
Text("View 2")
}
}
}
}
struct DetailView:View {
let item: Int
@EnvironmentObject var dataStore:DataStore
var body: some View {
Text("Item: \(dataStore.itemNumber)")
.onAppear {
self.dataStore.itemNumber = self.item
}
}
}