使用 SwiftUI 时异步填充/预填充多个用户可变的“@State”值?

Posted

技术标签:

【中文标题】使用 SwiftUI 时异步填充/预填充多个用户可变的“@State”值?【英文标题】:Asynchronously populate/pre-fill multiple, user mutable `@State` values when using SwiftUI? 【发布时间】:2019-08-19 21:17:39 【问题描述】:

我有一些带有“.text”值的TextField(s) 应该由“init()”(可以移动)中调用的方法填充,该方法异步调用完成处理程序来自网络的struct 数据。

问题是...用户还可以同时开始手动输入,完成回调不应覆盖手动编辑的值。 p>

我不知道该怎么做:

    更新@State String 变量的值以替换现有值,前提是它们尚未被用户修改...同时让最终用户可以更改它们. 一次从同一请求更新 N 个 @State 值。一个请求用于提取所有数据,因此映射到单个值同时使其如上文所述那样可变是目前令人头疼的问题。

这似乎是 Combine 的工作,只是还不确定从哪里开始。

【问题讨论】:

【参考方案1】:

我假设用户编辑是按字段进行的,所有其他字段都应该单独保留。

将所有状态移动到ObservableObject 中,创建状态变量@Published,从每个状态中获取一个发布者,并从每个状态中创建一个接收器,在每个接收器中设置一个变量if stateX != initialStateXValue stateXUserModified = true ,并拥有一个方法networkUpdate(loadedData:)ObservableObject 上仅在关联的 stateXUserModified 为 false 时设置状态。

【讨论】:

工作就像一个魅力,谢谢!尽管拥有一个包含这些东西的单一“可变状态”对象有点糟糕。 例如,如果我还想显示一个 Alert,如果出现错误,我必须移动单个 Identifiable var 整个View 也一样,不是吗? 前。 .alert($interactiveState.alertPresentable) (presentable) -> Alert in /* ... */ 因为似乎每个 View 中只支持第一个 .alert,至少在 Xcode 11b5 中是这样? 您也可以将整个东西放入一个属性包装器中,这样可以更好地使用和重用。 我没有看到呈现错误和问题之间的联系(根据是否为用户修改修改状态)。我听说使用Text("").hidden().alert 可以显示多个.sheet,但这是另一个问题

以上是关于使用 SwiftUI 时异步填充/预填充多个用户可变的“@State”值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftUI 2.0 和 Core Data 预填充数据

在 EditView 中使用 CoreData 中的值预填充 SwiftUI 表单

使用预“查找”中间件填充多个字段

使用预“查找”中间件填充多个字段

如何根据先前的用户选择在 Django 中预填充(多个)ChoiceField

如何使用链接从数据库中预填充表单字段?