[英]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 ,這種情況仍然存在。
有沒有辦法做到這一點?
根據您的評論 - 並糾正我的錯誤 - 這就是我的設置方式。
您的需求是:
MasterView
、“設置”、“視圖狀態”等等。 這是一切開始的地方。struct
、 class
,甚至是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.