swift 快速用户界面|预览未在@Binding变量值更改时更新

t98cgbkg  于 2023-02-07  发布在  Swift
关注(0)|答案(1)|浏览(116)

我正在学习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]))
    }
}

当我点击方形按钮时,预览没有更新,但应用程序工作正常。我是否使用错误?
编辑:即使没有.constant(#),预览也不起作用。

struct TodoRow_Previews: PreviewProvider {
    @State private static var todo = Todo.sampleData[0]

    static var previews: some View {
        TodoRow(todo: $todo)
    }
}
b4wnujal

b4wnujal1#

在文章Testing SwiftUI Bindings in Xcode Previews中找到了解决方案。
为了更改预览,您必须创建一个容器视图来保存状态并 Package 您正在处理的视图。
在我的情况下,我最终所做的是改变我的预览如下。

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")
        }
    }
}

相关问题