Ios 无法在此文件中预览-[应用程序名称]。应用程序可能已在Xcode 11 Beta 5上崩溃

Ios 无法在此文件中预览-[应用程序名称]。应用程序可能已在Xcode 11 Beta 5上崩溃,ios,iphone,xcode,swiftui,xcode11,Ios,Iphone,Xcode,Swiftui,Xcode11,如果添加EnvironmentObject属性包装器,Xcode预览将不起作用。每次我添加一个画布时,画布无法生成,我都会遇到以下错误: 无法在此文件中预览-[App Name]。应用可能已崩溃 如果我将environmentobject属性包装替换为ObservedObject并对其进行初始化,则一切正常 这是我的密码: class NetworkManager: ObservableObject { } struct ContentView : View { @Environme

如果添加
EnvironmentObject
属性包装器,Xcode预览将不起作用。每次我添加一个画布时,画布无法生成,我都会遇到以下错误:

无法在此文件中预览-[App Name]。应用可能已崩溃

如果我将
environmentobject
属性包装替换为
ObservedObject
并对其进行初始化,则一切正常

这是我的密码:

class NetworkManager: ObservableObject {

}

struct ContentView : View {
    @EnvironmentObject var networkManager: NetworkManager

    var body: some View {
        Text("Canvas not working")
    }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(NetworkManager())
    }
}
#endif
更新:

当我使用绑定时,它也不会加载预览:

struct ContentView:View{
@环境对象变量networkManager:networkManager
@绑定var test123:String
var body:一些观点{
文本(“画布不工作”)
}
}
#如果调试
结构内容视图\u预览:PreviewProvider{
@State static var test1=“”
静态var预览:一些视图{
ContentView(test123:$test1).environmentObject(NetworkManager())
}
}
#恩迪夫

看起来像是Xcode问题。尝试使用蓝色按钮而不是“重试”。

根据您提供的代码,我假设您的
场景公文包
如下所示:

如果让windowScene=场景为?新世{
let window=UIWindow(windowScene:windowScene)
window.rootViewController=UIHostingController(rootView:ContentView())
self.window=window
window.makeKeyAndVisible()的
}
我不想假装我完全知道画布在生成预览时在幕后做什么,但基于错误明确指出应用程序可能已崩溃的事实,我假设它在尝试生成预览时正在尝试启动整个应用程序。也许它需要使用
SceneDelegate
来启动预览,也许它完全是另一回事-我不能肯定

无论如何,应用程序崩溃的原因是您没有在
SceneDelegate
中传递环境对象。您的
SceneDelegate
应该如下所示:

如果让windowScene=场景为?新世{
let window=UIWindow(windowScene:windowScene)
window.rootViewController=UIHostingController(rootView:ContentView().environmentObject(NetworkManager()))
self.window=window
window.makeKeyAndVisible()的
}

正如@graycampbell所建议的,您需要确保在SceneDelegate中将EnvironmentObject提供给您的ContentView。虽然很多预览/画布机制都在一个黑盒子中,但Xcode的UI会建议调用一个新的预览或刷新一个现有的预览,构建(或更新)一个应用程序的变体,即使是常规预览,而不是“实时预览”。如果SceneDelegate设置不正确,此过程可能会失败

对于@Binding问题,Binding.constant(:)应该会有所帮助。根据.常量执行以下操作:

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(test123: .constant("Some Preview String"))
            .environmentObject(NetworkManager())
    }
}
#endif
创建具有不可变值的绑定

这是您想要预览的内容,而不是示例代码显示的@State。您可以在的第3节中看到使用中的.constant示例

因此,与此相反:

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    @State static var test1 = "Some Preview String"
    static var previews: some View {
        ContentView(test123: $test1)
             .environmentObject(NetworkManager())
    }
}
#endif
您可以执行以下操作:

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(test123: .constant("Some Preview String"))
            .environmentObject(NetworkManager())
    }
}
#endif
有了这个改变,你的代码预览对我来说就完美了。
请记住,您还需要在SceneDelegate或使用此特定ContentView的任何其他位置为该绑定提供一个值。否则,您将遇到与EnvironmentObject类似的问题,只是编译器错误突出显示了这一特殊遗漏。

对此,我确实有一个解决方法,但是的,错误确实存在于XCode中。
来解决这个问题。您必须首先设置您的
SceneDelegate

if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(NetworkManager()))
    self.window = window
    window.makeKeyAndVisible()
}. 
您也必须设置预览。看来你已经这么做了

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(NetworkManager())
    }
}. 
最后,只需在
ContentView
中声明一个
@State
变量,该变量的类型与
@发布的
@EnvironmentObject
相同,无论是否将其用于
ContentView
中的任何位置的绑定都无关紧要

@State var bindingVar: Double = 0.0
如前所述,这是XCode错误,我不知道为什么
ContentView
需要一个相同类型的@State变量来开始预览
@EnvironmentObject
绑定代码。
可能是
ContentView\u预览
无法从
@EnvironmentObject
中找到绑定

你可以在下面的代码中看到,它就像一个符咒


我也有同样的问题,我发现了原因。 我只是忘了添加
.environmentObject()
修饰符 到预览部分中的
ContentView()

struct Content_Previews: PreviewProvider {
    static var previews: some View {
       ContentView().environmentObject(NetworkManager())
    }
}
这就是为什么Xcode在没有显示代码错误的情况下构建了它,
但在画布预览时崩溃了简单的错误,我知道

在Beta 5中,您的示例构建和预览对我来说很好。您能否确认您发布的实际示例是否崩溃?我猜你没有包括整个NetworkManager。问题是这看起来不正确,但在我的实际应用程序中,我有很多视图,它们之间用.EnvironmentObject()表示。它仍然没有加载预览。查看我更新的问题,当我使用绑定时,它不会加载预览。问题的更新实际上不会改变任何内容。
@Binding
属性与您遇到的问题无关。如果您的应用程序实际上只是由您的
SceneDelegate
启动的
ContentView
,那么我的回答确实解决了这个问题,正如您的示例代码所示。如果你在问题中提供的代码不能准确地表示你的应用程序的结构,我就不可能给你一个关于你的实际应用程序的答案。我知道,但是我如何修复这个绑定内容
@binding
属性是不相关的-这是我的观点。binding属性并不是示例代码的缺陷。在添加绑定属性之前,预览尚未加载,为什么