我创建了一个新的SwiftUI项目,但代码不会加载到实时预览窗口中,我每次都会收到以下错误:
无法在此文件中预览-。但当我在模拟器上运行它时,它也适用于其他视图。
这是密码
import SwiftUI
import FirebaseAuth
class AppViewModel: ObservableObject {
let auth = Auth.auth()
@Published var LoggedIn = false
var isLoggedIn: Bool{
return auth.currentUser != nil
}
func LogIn(email: String, password: String) {
auth.signIn(withEmail: email, password: password) { [weak self] result, error in
guard result != nil, error == nil else{
return
}
DispatchQueue.main.async {
// Success
self?.LoggedIn = true
}
}
}
func SignUp(email: String, password: String) {
auth.createUser(withEmail: email, password: password) { [weak self] result, error in
guard result != nil, error == nil else{
return
}
DispatchQueue.main.async {
// Success
self?.LoggedIn = true
}
}
}
}
struct ContentView: View {
@EnvironmentObject var ViewModel : AppViewModel
var body: some View {
NavigationView {
if ViewModel.LoggedIn {
Text ("You are Logged In")
} else{
LogInView()
}
}
.onAppear {
ViewModel.LoggedIn = ViewModel.isLoggedIn
}
}
}
struct LogInView: View {
@State var email = ""
@State var password = ""
@EnvironmentObject var ViewModel : AppViewModel
var body: some View {
VStack {
TextField("Email Adress", text: $email)
.disableAutocorrection(true)
.autocapitalization(.none)
.padding()
.background(Color(.secondarySystemBackground))
.cornerRadius(15)
SecureField("Password", text: $password)
.disableAutocorrection(true)
.autocapitalization(.none)
.padding()
.background(Color(.secondarySystemBackground))
.cornerRadius(15)
Button(action: {
guard !email.isEmpty, !password.isEmpty else{
return
}
ViewModel.LogIn(email: email, password: password)
}) {
Text("Log In")
.foregroundColor(Color.white)
.font(.headline)
.frame(maxWidth: .infinity)
.frame(height: 50)
.background(Color.accentColor)
.cornerRadius(20.0)
}
NavigationLink("Create an account", destination: SignUpView())
.padding()
}
.padding(.horizontal, 24.0)
.navigationTitle("Welcome")
}
}
struct SignUpView: View {
@State var email = ""
@State var password = ""
@EnvironmentObject var ViewModel : AppViewModel
var body: some View {
VStack {
TextField("Email Adress", text: $email)
.disableAutocorrection(true)
.autocapitalization(.none)
.padding()
.background(Color(.secondarySystemBackground))
.cornerRadius(15)
SecureField("Password", text: $password)
.disableAutocorrection(true)
.autocapitalization(.none)
.padding()
.background(Color(.secondarySystemBackground))
.cornerRadius(15)
Button(action: {
guard !email.isEmpty, !password.isEmpty else{
return
}
ViewModel.SignUp(email: email, password: password)
}) {
Text("Sign Up")
.foregroundColor(Color.white)
.font(.headline)
.frame(maxWidth: .infinity)
.frame(height: 50)
.background(Color.accentColor)
.cornerRadius(20.0)
}
}
.padding(.horizontal, 24.0)
.navigationTitle("Create an Account")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
2条答案
按热度按时间5f0d552i1#
我有同样的问题,我可以在模拟器/真实的设备中构建项目,没有任何问题,但我不能利用SwiftUI预览功能。
我收到了相同的错误消息“消息发送失败”,其中诊断报告提到他们无法找到相关的SwiftUI视图文件。我已向苹果公司提出审查请求。
同时,我找到了一个变通办法,即关闭“Automatically Refresh Canvas”(自动刷新画布)选项,网址为
Xcode〉〉编辑器〉〉画布〉〉自动刷新画布。
这允许预览,至少加载,你可以手动刷新他们使用播放按钮在设备上。
关闭后,它会加载预览,你可以点击播放按钮刷新预览。
--2022年1月12日更新--
我花了很多时间来解决这个问题,并找到了一个可重复的解决方案,在收到一封来自AppleDTS的电子邮件后,他们认为这是一个错误。进一步的请求需要通过反馈助手,并将分享来自苹果的反馈,如果我发现任何有用的东西。
在我这边,这个问题一次又一次地出现,如果你使用M1 Macbook Pro和在构建中排除Arm 64架构,沿着各种cocopod,那么找到了一种(相当肮脏的)利用SwiftUI的方法。下面是我到目前为止找到的最安全/最简单的方法,至少在我这边,让预览工作。
1.清理Xcode(派生数据、设备支持、构建缓存)
1.(如果您有cocoapods和XCworkspace文件)arch -x86_64 pod在终端中取消整合
1.删除旧的XCworkspace文件和Podfile.lock
1.重新安装pod- arch -x86_64 pod安装
1.选中Xcode信息中的“使用Rosetta打开”
1.打开新的XCworkspace文件
1.运行iOS模拟器为iPhone构建缓存(如果有iOS应用程序)
1.运行WatchOS模拟器为手表构建缓存(如果有watchOS应用程序)
1.确保此时cocoapods/swift版本等没有其他问题。
1.关闭“Automatically Refresh Canvas”(自动刷新画布)以检查预览是否加载,并在打开“Automatic canvas refresh”(自动刷新画布)功能时(对contentView/SwiftUIview进行任何更改时)查看“Message Send Failure”(消息发送失败)错误消息。
1.关闭Xcode文件,但不移除构建缓存。
1.取消选中Xcode信息中的“使用Rosetta打开”。
1.重新打开XCworkspace文件。
1.(可选)运行模拟器
1.使用SwiftUI,同时保持“自动刷新画布”打开。
请随时分享,如果你已经找到了一个更好的解决方案,在此期间。这所以职位是一个导致我的临时变通办法。
“Cannot preview in this file - Connection interrupted: send previewInstances message to agent" error in Xcode 12
cs7cruho2#
截至2022年10月,我尝试了上述方法,但效果不佳,我一直在摆弄它,最终每次打开项目时,我的Xcode都进入了无限加载状态。
幸运的是,我最近所做的所有更改都备份到了git中。因此,我在iCloud Drive之外创建了一个新文件夹,拉下了项目,现在一切--包括预览--似乎都正常了。
注意:我为Xcode打开了“Open With Rosetta”(使用Rosetta打开)
决定尝试在iCloud Drive之外克隆,这要感谢此帖子:https://stackoverflow.com/a/73035814