- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建 MyViewModel
,它从网络获取数据,然后更新结果数组。 MyView
应该订阅 $model.results
并显示包含结果的 List
。
不幸的是,我收到有关“没有更多上下文的表达式类型不明确”的错误。
如何在这种情况下正确使用 ForEach
?
import SwiftUI
import Combine
class MyViewModel: ObservableObject {
@Published var results: [String] = []
init() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.results = ["Hello", "World", "!!!"]
}
}
}
struct MyView: View {
@ObservedObject var model: MyViewModel
var body: some View {
VStack {
List {
ForEach($model.results) { text in
Text(text)
// ^--- Type of expression is ambiguous without more context
}
}
}
}
}
struct MyView_Previews: PreviewProvider {
static var previews: some View {
MyView(model: MyViewModel())
}
}
附言如果我用 @State var results: [String]
替换模型,一切正常,但我需要单独的 class MyViewModel: ObservableObject
用于我的目的
最佳答案
修复
更改您的 ForEach
阻止
ForEach(model.results, id: \.self) { text in
Text(text)
}
解释
SwiftUI 的错误消息在这里对您没有任何帮助。真正的错误消息(如果将 Text(text)
更改为 Text(text as String)
并删除 $
之前的 model.results
,您将看到)是“无法推断通用参数‘ID’”。
换句话说,使用ForEach
,您正在迭代的元素需要以两种方式之一进行唯一标识。
var id: Hashable
使其符合Identifiable 协议(protocol)。 .你不需要 id
本例中的参数。ForEach
使用 id
作为唯一标识符使用什么范围。 更新:由您来保证您的集合没有重复的元素。如果两个元素具有相同的 ID,则对一个 View 所做的任何更改(如偏移量)都会同时影响两个 View 。在这种情况下,我们选择了选项 2 并告诉 ForEach
使用 String 元素本身作为标识符 ( \.self
)。我们可以这样做,因为 String 符合 Hashable 协议(protocol)。
那$
呢? ?
SwiftUI 中的大多数 View 仅获取您应用的状态并根据它布置它们的外观。在此示例中,Text View 仅获取存储在模型中的信息并显示它。但是一些 View 需要能够返回并修改应用程序的状态以响应用户:
我们确定应用程序状态和 View 之间应该存在这种双向通信的方法是使用 Binding<SomeType>
.所以 Toggle 需要你传递给它 Binding<Bool>
, slider 需要 Binding<Double>
,而 TextField 需要 Binding<String>
.
这是 @State
的位置属性包装器(或 @Published
内部的 @ObservedObject
)进来。该属性包装器“包装”它包含在 Binding
中的值。 (以及其他一些保证 SwiftUI 知道在值更改时更新 View 的东西)。如果我们需要获取值,我们可以简单地引用myVariable
, 但如果我们需要绑定(bind),我们可以使用简写 $myVariable
.
因此,在这种情况下,您的原始代码包含 ForEach($model.results)
.换句话说,您是在告诉编译器“迭代这个 Binding<[String]>
”,但是 Binding
不是您可以迭代的集合。删除 $
表示,“遍历此 [String]”,而 Array 是一个您可以遍历的集合。
关于swift - 如果数组是 ObservableObject 的成员,如何绑定(bind)数组和列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58069967/
我有一个名为 PurchaseView 的 View .此 View 显示有关购买、购买的内容和购买者的详细信息。我正在做的是,在这个 View 中,我同时放置了 ItemView和 ClientVi
public typealias ObservableObject = ObservableObject 为什么这个看似毫无意义的类型别名在这里? 最佳答案 您可以在 swift-corelibs-f
我有一个可以保存图像的游戏对象。每当找到游戏的图像 URL 时,就应该创建一个新的 GameImage 对象实例。然后它将获取图像并填充 UIImage 属性。发生这种情况时,应更新 UI 以显示图像
使用 SwiftUI 我想按下一个按钮并让它切换用于过滤图像的类。 在 SwiftUI 中,按钮会执行如下操作: @ObservedObject var currentFilter = FilterC
问题 为了实现应用程序代码的简洁外观,我为每个包含逻辑的 View 创建了 ViewModel。 一个普通的 ViewModel 看起来有点像这样: class SomeViewModel: Obse
我有一个设置为 ObservableObject 的类: class MatchData : Identifiable, ObservableObject { @Published
好的,SwiftUI 和 ObservableObject,在 iOS 13 上。我有 Model 实现了 ObservableObject: class Model: ObservableObjec
我有一个类Foo对 ObservableObject 具有多个依赖项.出于测试目的,我想创建这些对象的模拟版本,但我看不到这样做的方法,然后将它们注入(inject) Foo . 我无法创建另一个协议
我想在 SwiftUI 中有一个可选的 @ObservedObject 但我一直收到编译时错误。 Property type 'AModel?' does not match that of the
我有一个 ObservableObject class CurrentPosition: ObservableObject { @Published var northEast = CLLoc
我在 View 中创建了一个 ObservableObject。 @ObservedObject var selectionModel = FilterSelectionModel() 我在 Filt
class Group: ObservableObject { @Published var size: CGFloat = 22 } struct content: View { @
我对 SwiftUI 很陌生(而且我也有一段时间没有接触过 Swift)所以请耐心等待: 我有这样的看法: import SwiftUI import Combine var settings = U
当 SwiftUI View 绑定(bind)到 ObservableObject 时,当被观察对象发生任何变化时, View 会自动重新加载 - 无论是否更改直接影响 View 。 这似乎会给非平凡
我想在 ObservableObject 中导入一个实际的变量集: 我的代码是: import SwiftUI struct HomepageView: View { @ObservedOb
请帮助我理解 MVVM 模式中的一件事: 例如,我需要在 map 上显示城市。在 ViewModel 中,我有 ObservableCollection,它绑定(bind)到 View ItemsSo
我在我的 DateView 中有一个这样声明的 ObservableObject: import SwiftUI class SelectedDate: ObservableObject {
我尝试使 NWPathMonitor 成为一个可观察对象,如果有网络连接则返回 true,否则返回 false。 你能帮我吗,因为我的解决方案不起作用。 谢谢 import Foundation im
我正在尝试学习与 SwiftUI 结合,我正在努力如何使用 ObservableObject 更新我的 View (来自 UIKit) (以前的 BindableObject )。显然,问题是方法 u
我有一个 SwiftUI 项目和一个绑定(bind)到 EnvironmentObject 的 View 。该对象包含一个@Published 属性。 import Foundation class
我是一名优秀的程序员,十分优秀!