簡體   English   中英

如何在 SwiftUI NavigationView 中重新初始化類

[英]How to re-initialise classes in a SwiftUI NavigationView

我有兩個視圖 - MasterView 和 DetailView。 打開 DetailView 時,我初始化了一個新的 class 來跟蹤有關視圖的數據(在實際實現中,詳細視圖涉及游戲)。

但是,當我從 DetailView 按下返回按鈕返回到 MasterView,然后按下按鈕返回到 DetailView 時,我的 class 沒有改變。 但是,每當我從 MasterView 移動到 DetailView 時,我想重新初始化這個 class 的新副本(在我的情況下是重新啟動游戲)。

我已將問題濃縮為這段代碼:

import SwiftUI
import Combine

class Model: ObservableObject {
    @Published var mytext: String = "mytext"
}

struct MasterView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailView(model: Model())) {
                Text("press me")
            }
        }
    }
}

struct DetailView: View {
    @ObservedObject var model: Model = Model()

    var body: some View {
        TextField("Enter here", text: $model.mytext)
    }
}


struct MasterView_Previews: PreviewProvider {
    static var previews: some View {
        MasterView()
    }
}

每次單擊 NavigationLink 到詳細視圖時,我都想創建一個Model的新實例,但它似乎總是指回相同的原始實例 - 我可以通過在 DetailView 的文本字段中輸入更改來查看,如果我再次來回 go ,這種情況仍然存在。

有沒有辦法做到這一點?

根據您的評論 - 並糾正我的錯誤 - 這就是我的設置方式。

您的需求是:

  • 一個“基礎”class。 MasterView 、“設置”、“視圖狀態”等等。 這是一切開始的地方。
  • “當前游戲”....好吧,它可以是structclass ,甚至是ObservableObject中的屬性。

我想就是這樣。 從層次上講,您的 model可能是:

視圖狀態

...播放器

......屬性,包括 ID 和歷史記錄

...當前游戲

......屬性,包括難度

請注意,我已經更改了一些名稱,並且對屬性非常模糊。 關鍵是,您可以將所有這些封裝在ObservableObject中,為其創建一個 `EnvironmentObject,並讓所有 SwiftUI 視圖對其中的更改“做出反應”。

省略視圖,希望您可以看到這個“模型”可以包含幾乎所有您希望做所有事情的 Swift 代碼 - 現在您所需要的只是綁定您的視圖。

(1) 創建您的ObservableObject 需要(a) 是 class object 和 (b) 符合ObservableObject協議。 這是一個簡單的:

class ViewState : ObservableObject {
    var objectWillChange = PassthroughSubject<Void, Never>()
    @Published var playerID = ""  {
        willSet {
            objectWillChange.send()
        }
    }
}

您可以根據需要在 model 中創建更多結構/類並實例化它們。

(2) 在您的環境中實例化一次ViewState SceneDelegate

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: ContentView()
            .environmentObject(ViewState())
        )
        self.window = window
        window.makeKeyAndVisible()
    }
}

請注意,這里添加了一行,並且ViewState被實例化了一次。

(3)最后,在任何需要知道你的視圖state的SwiftUI視圖中,通過添加一行代碼進行綁定:

@EnvironmentObject var model: ViewState

如果您願意,您幾乎可以在 model ( ViewState ) 中執行任何操作,包括實例化新游戲、標記某些內容以導致模式彈出窗口、將玩家添加到數組等等。

我希望我要解釋的主要內容是無需實例化第二個視圖 state - 而是在單個視圖 state 中實例化第二個游戲實例

同樣,如果我與您的需求相去甚遠,請告訴我 - 我很樂意刪除我的答案。 祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM