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属性并不是示例代码的缺陷。在添加绑定属性之前,预览尚未加载,为什么