iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
Mobile Development

從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始系列 第 12

從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day12

  • 分享至 

  • xImage
  •  

Day12 ObservableObject

如果要讓一個變數在不同的頁面都可以呼叫得到,而且都可以獲得相同的變數值。因為@State只能使用在單一頁面,傳入到其它頁面時,其值就不會產生同步。這個時候就必須要使用ObservableObject。

宣告一個物件並且繼承ObservableObject,例如:

class MyObject: ObservableObject {
    @Published var count = 0
}

在這個物件內宣告一個變數為@Published,表示這個變數可以產生同步狀態。

接下來製作一個按鈕跟文字,這個按鈕會將變數累加1,例如:

@ObservedObject var myObject = MyObject()
    
var body: some View {
    VStack{
        Text("\(myObject.count)")
            
        Button(action: {
            myObject.count = myObject.count + 1
        }, label: {
            Text("Button")
        })
    }
}

宣告一個變數myObject為MyObject()物件初始化,並且宣告為@ObservedObject。

當按下按鈕時,myObject內的count變數,就會累加1。

接下來製作一個新的頁面,例如:

struct SwiftUIView12_Page2: View {
    
    @ObservedObject var myObject: MyObject
    
    var body: some View {
        VStack{
            Text("\(myObject.count)")
            
            Button(action: {
                myObject.count = myObject.count + 1
            }, label: {
                Text("Button")
            })
        }
    }
}

一樣宣告myObject變數為MyObject,但這裡不進行物件初始化,這裡可以由呼叫者來帶入。

然後回到第一頁,使用NavigationSplitView來產生導覽可以跳轉到第二頁,例如:

NavigationSplitView {
    VStack{
        Text("\(myObject.count)")
                
        Button(action: {
            myObject.count = myObject.count + 1
        }, label: {
            Text("Button")
        })
                
        NavigationLink {
            SwiftUIView12_Page2(myObject: myObject)
                    
        } label: {
            Text("Go To Page2")           
        }
    }
} detail: {
    Text("NavigationSplitView detail")
}

在呼叫SwiftUIView12_Page2時,將變數myObject直接傳入,就表示第二頁也可以使用這個變數,達到一個同步的狀態。

所以當第一頁的按鈕已經累加到10時

顯示如圖:

https://ithelp.ithome.com.tw/upload/images/20240812/20162607Xqpj2DyYnk.png

此時,跳轉到第二頁時,也會同步顯示累加到10

顯示如圖:

https://ithelp.ithome.com.tw/upload/images/20240812/20162607DwhlOPSIe1.png

而此時如果在第二頁持續累加到20,回到上一頁時,也會同步顯示累加到20。

https://ithelp.ithome.com.tw/upload/images/20240812/20162607tL5ZjbLOsF.png

https://ithelp.ithome.com.tw/upload/images/20240812/20162607HbKKJe5KHa.png

從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day12 [完]


上一篇
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day11
下一篇
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day13
系列文
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言