【问题标题】:How to pass data from an observed class to another?如何将数据从观察到的类传递给另一个?
【发布时间】:2020-07-11 07:04:41
【问题描述】:

这篇文章与this post that I made相关。虽然现在没有初始化错误,但似乎这里有一个问题:当您更改文本字段中的用户名时,url 和付款明细仍然不会更新?知道如何解决这个问题吗?

struct passingData: View {
    
    @ObservedObject var userData: UserData
    @ObservedObject var images: ImageURL
    @ObservedObject var payment: Payment
    
    init() {
       let data = UserData()
      
       self.userData = data
       self.images = ImageURL(userData: data)
       self.payment = Payment(userData: data)
    }
    
    
    
    var body: some View {
        
        VStack{
            TextField("Enter userName", text: $userData.userName)
            Text("url is \(images.imageURL)")
            Text("Payment detail: \(payment.paymentDate)")
        }
    }
}


class Payment: ObservableObject{
    @Published var paymentDate = ""
    @ObservedObject var userData: UserData
    init(userData: UserData){
        self.userData = userData
        loadPaymentDate()
    }
    
    func loadPaymentDate(){
        self.paymentDate = "last payment date from \(userData.userName) is 12.12.22 "
    }

}


class ImageURL: ObservableObject{
    @Published var imageURL = ""
    @ObservedObject var userData: UserData
    init(userData: UserData){
        self.userData = userData
        loadImageURL()
    }
    
    func loadImageURL(){
        self.imageURL = "123_\(userData.userName).com"
    }
}



class UserData: ObservableObject{
    @Published var userName = ""
    
}

【问题讨论】:

  • 付款明细没有更新是什么意思?您指的是paymentDate 属性的值吗?您仅在创建 Payment 对象时设置该值。它不会因为 userData.userName 属性发生变化而改变。

标签: ios swift class swiftui observable


【解决方案1】:

您不能在类中使用@ObservedObject 属性包装器,它是专为View 设计的。

这是一个类的解决方案演示。使用 Xcode 12 / iOS 14 测试

import Combine

class ImageURL: ObservableObject{
    @Published var imageURL = ""

    private var userData: UserData            // << reference type
    private var observer: AnyCancellable?
    init(userData: UserData){
        self.userData = userData

        // observe changes of userName via publisher explicitly
        self.observer = userData.$userName.sink(receiveValue: {[weak self] _ in
            self?.loadImageURL()
        })

        loadImageURL()
    }

    func loadImageURL(){
        self.imageURL = "123_\(userData.userName).com"
    }
}

【讨论】:

  • 我是 swift 新手,对 AnyCancellable 协议了解不多。这行得通!谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-03-13
  • 2019-10-15
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多