【问题标题】:How to observe Text in the SwiftUI or pass String to the ViewModel in other way?如何在 SwiftUI 中观察 Text 或以其他方式将 String 传递给 ViewModel?
【发布时间】:2021-06-14 18:47:28
【问题描述】:

我有问题。我在视图之间传递一个字符串并使用它,从数据库下载数据。然后字符串转到文本。我想在 SwiftUI 中观察 Text(不是 TextField)或将 String 传递给 ViewModel。我知道如何在 Textfield 的情况下做到这一点,但在 Text 中有可能吗?

查看:

import SwiftUI

struct RefuelingListView: View {

@ObservedObject var viewModel: RefuelingListViewModel
var vehicle: Vehicle

var body: some View {
    
    VStack(alignment: .leading) {
        
        Text(vehicle.name)
        .font(.system(size: 24))
        .bold()
        .frame(width: 380, height: 60, alignment: .topLeading)
        .padding(.top, -20)
        .padding(.leading, 10)
    
    List(viewModel.refuelings) { refueling in
        RefuelingListRow(refueling: refueling)
    }
    }
}
}

视图模型:

 import Foundation

class RefuelingListViewModel: ObservableObject {

@Published var refuelings = [Refueling]()

private let persistenceService: PersistenceServiceProtocol

init(persistenceService: PersistenceServiceProtocol) {
    self.persistenceService = persistenceService
}

【问题讨论】:

  • “观察”Text 没有真正意义,因为它没有变化的值。您已经可以通过vehicle.name 访问Text 中的内容。你只是问如何在视图模型上调用函数吗?
  • 是的,但我希望它在视图模型中。 vehicle.name 的数据来自另一个视图。
  • 这两个路径一般是:1)在视图中使用onAppear向视图模型发送值并加载数据2)在视图上使用init,这样你就可以显式发送一个视图模型的初始值(不推荐,因为init 不应该做繁重的工作)
  • 你能给我举个例子吗?我的意思是 onAppear。
  • 我用一个简单的例子添加了答案。我无法使用您的类型,因为它们不包含在此处,而且尚不清楚 vehicle.name 的去向,但这应该足以让您开始使用。

标签: ios swiftui


【解决方案1】:

正如 cmets 中所讨论的,这里有一个使用 onAppear 将值传递给 ObservableObject 的示例:

class ViewModel : ObservableObject {
    @Published var myValue = ""
}

struct ContentView : View {
    private var myValue = "Updated value"
    @ObservedObject private var viewModel = ViewModel()
    
    var body: some View {
        Text(viewModel.myValue)
            .onAppear {
                viewModel.myValue = myValue
            }
    }
}

【讨论】:

  • 有效!非常感谢。你节省了我的时间。
猜你喜欢
  • 2016-07-31
  • 2020-10-30
  • 2020-07-07
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 2018-12-23
相关资源
最近更新 更多