iT邦幫忙

0

Swift UI ObservableObject傳值 Array不會自動更新

https://ithelp.ithome.com.tw/upload/images/20210830/20136458wnMdEoPVbj.pnghttps://ithelp.ithome.com.tw/upload/images/20210830/20136458LjAmt2ZvRE.pnghttps://ithelp.ithome.com.tw/upload/images/20210830/20136458Cl4BE4BxEc.pnghttps://ithelp.ithome.com.tw/upload/images/20210830/20136458s7dXzvcXS6.png
我添加了一個Array sum(),我把在A1()這個View裡面加數值進去sum(),但點進b1()後,b1()讀到的Array 仍然只有第一個位置而已。請問這個要怎麼解決?

另外想詢問 假設今天 我有這樣一個程式 裡面包含添加今日成績,當我輸入一個成績,就存在Array裡,Array每多一個數值,在我的secondView裡的list就多一個Text方塊(顯示今輸入過的成績,一個個顯示下來)。這樣要如何做到這樣的效果呢?因為我目前學的都是要先設定好Text。

先感謝各位大大!

通靈亡 iT邦高手 1 級 ‧ 2021-08-30 13:50:34 檢舉
就你的寫法,目前 b1 的 sum 跟 a1 的 sum 是兩個沒有任何關係的變數。
跟你上次的問題一樣:不要以為你在兩個地方宣告相同名稱的常數或變數,那兩個常數或變數就會自動建立連結,彼此互相通靈。

稍微參考一下這兩篇文章範例和說明,了解怎麼在不同 View 之間共用變數:

1. Managing Model Data in Your App
https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app

2. How to use @EnvironmentObject to share data between views
https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
BananaYK
iT邦見習生 ‧ 2021-11-01 22:19:32

小弟菜雞,解答

app

import SwiftUI

@main
struct IThelp_01App: App {
    @StateObject var  userInput = UserInput()  //更動
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(userInput)  //更動
        }
    }
}

a1 view

import SwiftUI

struct a1: View {
    var a = [100,200]
    @State var karl = 0
    @State var karlusum = 0
    @EnvironmentObject var input : UserInput  //更動
    var body: some View {
        
        Picker(selection:$karl, label:  Text("請輸入熱量")) {
            Text("100").tag(0)
            Text("200").tag(1)
        }
        Button(action:{
            karlusum = 0
            karlusum = a[karl]
            input.sum.append(karlusum)
            print(input.sum)
        }, label: {
            Text("確認")
        })
    }
}

struct a1_Previews: PreviewProvider {
    static var previews: some View {
        a1()
            .environmentObject(UserInput())  //更動
    }
}

b1 view

class UserInput: ObservableObject {
    @Published var sum = [1]
}

struct b1: View {
    @EnvironmentObject var input : UserInput    //更動
    var body: some View {
        VStack{
            Text("\(input.sum[2])")
            
            //這個應該是你問題的解答
            ForEach(input.sum, id: \.self) { i in
                Text("\(i)")
            }
            
        }
    }
}

struct b1_Previews: PreviewProvider {
    static var previews: some View {
        b1()
            .environmentObject(UserInput())   //更動
    }
}

之前看 https://youtu.be/vL0w3kvng0o 都沒看動
被留言講一下小開竅

姜義新 iT邦新手 4 級 ‧ 2021-11-06 10:28:43 檢舉

感謝您的解答~ 可惜早就解決了~ 我後來是使用 Passing data via @ObservedObject and @StateObject 完成的! 有興趣的話可以參考這裡文章

我要發表回答

立即登入回答