Как передать данные из наблюдаемого класса в другой? - PullRequest
1 голос
/ 11 июля 2020

Этот пост связан с этим сообщением, которое я сделал . Хотя сейчас ошибки инициализации больше нет, похоже, что здесь есть одна проблема: когда вы меняете имя пользователя в текстовом поле, 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 = ""
    
}

1 Ответ

2 голосов
/ 11 июля 2020

Нельзя использовать оболочку свойств @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"
    }
}
...