SwiftUI | 预览未更新 @Binding var 值更改

1 swift swiftui

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