我創建了一個這樣的模型
import Foundation
class Play:ObservableObject{
@Published var name:String="Tayle"
@Published var age:Int=12
}
它將在兩個視圖中使用
例如:
struct Demo: View {
//1
@State private var play:Play = Play()
//2
//@StateObject private var play:Play = Play()
var body: some View {
NavigationView{
NavigationLink(destination: PlayNameView(play: play)){
Text("go to platnbame")
}
}
}
}
struct PlayNameView:View{
@ObservedObject var play:Play
var body: some View{
HStack{
Text("Hello,\(play.name)")
Button(action:{
play.name="iop"
}){
Text("change the name to:iop")
}
}
}
}
當我運行該專案時,它們具有相同的行為。如果@StateObject 可以做到,為什么選擇@State
uj5u.com熱心網友回復:
@State是一個變數,用于保存值型別,例如 Bools、Integers、Strings、structs 等。Apple 根本不打算@State將其用于諸如 之類的參考型別ObservableObjects,因為再一次,State 旨在存盤諸如 Int 之類的值型別,而不是類的實體。蘋果在檔案中說,
不要將狀態屬性用于持久存盤,因為狀態變數的生命周期反映了視圖的生命周期。相反,使用它們來管理僅影響用戶界面的瞬態狀態,例如按鈕的突出顯示狀態、過濾器設定或當前選定的串列項。
簡而言之,您可以使用@State變數來存盤用戶單擊按鈕的次數(自應用程式啟動以來),但不能存盤另一個ObservableObject. 此外,如果您查看this,文章顯示使用帶有 State 的 Object 不會導致視圖的實際變數更新。這是因為,再次參考這篇文章,
因為我們使用的是復雜的參考型別,所以 state 本身的值永遠不會改變。雖然 state 的屬性 num 發生了變化,但 @State 屬性包裝器不知道,因為它只觀察變數 state,而不是它的任何屬性。對于 SwiftUI,因為它只是觀察狀態,它不知道 num 已經改變,所以永遠不會重新渲染視圖。
@StateObject另一方面,An可以存盤諸如 之類的東西ObservableObjects。當 Object 的值發生變化時,會引起視圖的更新,因為這一切都被SwiftUI. 但是,這只會發生在@Published屬性上,并且這些屬性的任何更改都將再次導致視圖重新渲染。還有一個重要的注意事項:@StateObject每次視圖出現時都會創建一個新實體。如果您需要保留這些值,則需要從更根視圖傳入物件。此外,@StateObject可以從視圖外部更改變數,而@State變數僅用于私有和本地。有關原因的更多資訊,請參閱 AppleState檔案:https ://developer.apple.com/documentation/swiftui/state
資源:
- https://story.tomasen.org/swiftui-difference-of-state-binding-environment-and-environmentobject-and-when-to-use-them-ff80699f45b7
- https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-stateobject-property-wrapper
- https://www.hackingwithswift.com/quick-start/swiftui/whats-the-difference-between-observedobject-state-and-environmentobject
- https://levelup.gitconnected.com/state-vs-stateobject-vs-observedobject-vs-environmentobject-in-swiftui-81e2913d63f9#:~:text=Use @ State for very simple,than what @State can handle。
uj5u.com熱心網友回復:
對于 Objects 使用 @StateObject 屬性包裝器,對于 String、Int 等使用 @State 屬性包裝器。
@State:當我們觀察到 ContentView 中存在的屬性時,我們會使用此屬性包裝器。
@StateObject:當我們觀察存在于 ContentView 之外的屬性時,我們使用這個屬性包裝器,比如在我們的 Object 中,我們可以通過首先使該類符合 ObservableObject 協議并將該屬性標記為我們的 Object 中的 @Published 來觀察屬性的變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486949.html
