SwiftUI @Binding预览崩溃:与应用程序的通信被中断

时间:2019-07-15 20:10:35

标签: swift xcode swiftui xcode11

所以我有一个XCode项目,其中有2个.swift文件,这些文件通过SwiftUI的@Binding共享一个变量。

该项目可以很好地构建并运行在模拟器中。

但是,每当我尝试在辅助文件(从主文件接收变量)上使用“预览”时,成功构建并显示“ MyProject.app崩溃:与应用程序的通信被中断”后,崩溃。

我仍然可以通过以下方式测试项目:

  1. 使用模拟器
  2. 预览主文件(ContentView.swift)(可以预览主文件很好)

但是,由于它在我的应用程序中需要执行多个操作才能到达辅助文件的视图,并且每次Xcode刷新应用程序时,它都会花费大量时间进行构建和测试。

这是我的声音文件代码:

import SwiftUI

struct Menu_Screen : View {
    @Binding var TapToBegin:Bool
    var body: some View {
        Button(action: {

        }) {
            Text("A Button").color(.white).frame(width: TapToBegin ? 50:0, height: TapToBegin ? 100:0).background(Color.blue).cornerRadius(10)
        }
    } }

#if DEBUG 
    struct Menu_Screen_Previews : PreviewProvider {
    @State static var BoolVariable = true
    static var previews: some View {
        Menu_Screen(TapToBegin: $BoolVariable)
    } }
#endif

我想对其他文件使用“预览”,这样我就可以始终停留在其视图上并节省时间。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

其他答案将我引向正确的方向,但并没有为我解决问题。我在Xcode中遇到了相同的错误,但是发送视图所需的绑定不仅是布尔值,而且是结构数组。我正在发布我的工作代码,希望它可以帮助其他人解决此错误。

struct StudentsView_Previews: PreviewProvider {
    static let prevStudents: [Student] = [
         Student(id: UUID().uuidString, firstName: "John", lastName: "Doe"),
         Student(id: UUID().uuidString, firstName: "Jane", lastName: "Doe"),
         Student(id: UUID().uuidString, firstName: "Sam", lastName: "Smith")
    ]
    static let prevStudentsBinding = Binding.constant(prevStudents)
    static let prevClassTitle = "Math 100"

    static var previews: some View {
        StudentsView(students: prevStudentsBinding, classTitle: prevClassTitle)
    }
}

struct Students: View {
    @Binding var students: [Student]
    let classTitle: String

    var body: some View {
        List(students.indices) { idx in
            Text(self.students[idx].fullName())
        }       
    }.navigationBarTitle(classTitle)
}

struct Student : Identifiable {
    var id: String
    var firstName: String
    var lastName: String
    func fullName() -> String {
        return firstName + " " + lastName
    }
}

答案 1 :(得分:0)

#if DEBUG
struct Menu_Screen_Previews : PreviewProvider {
    static var BoolVariable = true
    static let BoolVariableBinding = Binding(getValue: { BoolVariable },
                                             setValue: { BoolVariable = $0 })
    static var previews: some View {
        Menu_Screen(TapToBegin: BoolVariableBinding)
    }
}
#endif

答案 2 :(得分:0)

替换

#if DEBUG 
    struct Menu_Screen_Previews : PreviewProvider {
    @State static var BoolVariable = true
    static var previews: some View {
        Menu_Screen(TapToBegin: $BoolVariable)
    } }
#endif

使用

#if DEBUG 
    struct Menu_Screen_Previews : PreviewProvider {

    static var previews: some View {
        Menu_Screen(TapToBegin: .constant(true))
    } }
#endif