swift 无法在此文件中预览--消息发送失败

bqucvtff  于 2022-10-31  发布在  Swift
关注(0)|答案(2)|浏览(337)

我创建了一个新的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()
    }
}
5f0d552i

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

cs7cruho

cs7cruho2#

截至2022年10月,我尝试了上述方法,但效果不佳,我一直在摆弄它,最终每次打开项目时,我的Xcode都进入了无限加载状态。
幸运的是,我最近所做的所有更改都备份到了git中。因此,我在iCloud Drive之外创建了一个新文件夹,拉下了项目,现在一切--包括预览--似乎都正常了。
注意:我为Xcode打开了“Open With Rosetta”(使用Rosetta打开)
决定尝试在iCloud Drive之外克隆,这要感谢此帖子:https://stackoverflow.com/a/73035814

相关问题