我正在学习SwiftUI并尝试制作一个简单的待办事项列表,但我无法理解为什么@Binding属性不更新我的预览。
代码如下。
import SwiftUI
struct TodoRow: View {
@Binding var todo: Todo
var body: some View {
HStack {
Button(action: {
todo.completed.toggle()
}, label: {
Image(systemName: todo.completed ? "checkmark.square" : "square")
})
.buttonStyle(.plain)
Text(todo.title)
.strikethrough(todo.completed)
}
}
}
struct TodoRow_Previews: PreviewProvider {
static var previews: some View {
TodoRow(todo: .constant(Todo.sampleData[0]))
}
}
Run Code Online (Sandbox Code Playgroud)
当我单击方形按钮时,预览不会更新,但应用程序运行正常。是我使用方式不对吗?
编辑:即使没有 .constant(#),预览也不起作用。
struct TodoRow_Previews: PreviewProvider {
@State private static var todo = Todo.sampleData[0]
static var previews: some View {
TodoRow(todo: $todo)
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
在《Testing SwiftUI Bindings in Xcode Previews》一文中找到了解决方案。
为了更改预览,您必须创建一个容器视图来保存状态并包装您正在处理的视图。
就我而言,我最终所做的是将预览更改为以下内容。
struct TodoRow_Previews: PreviewProvider {
// A View that simply wraps the real view we're working on
// Its only purpose is to hold state
struct TodoRowContainer: View {
@State private var todo = Todo.sampleData[0]
var body: some View {
TodoRow(todo: $todo)
}
}
static var previews: some View {
Group {
TodoRow(todo: .constant(Todo.sampleData[0]))
.previewDisplayName("Immutable Row")
TodoRowContainer()
.previewDisplayName("Mutable Row")
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
858 次 |
| 最近记录: |