尝试在同一视图上的文本字段之间移动后,SwiftUI 应用程序在控制台中冻结且没有错误

Posted

技术标签:

【中文标题】尝试在同一视图上的文本字段之间移动后,SwiftUI 应用程序在控制台中冻结且没有错误【英文标题】:SwiftUI app freezes with no errors in console after attempting to move between textfields on same view 【发布时间】:2019-08-06 13:19:28 【问题描述】:

我有一个简单的登录视图,包含两个文本字段、一个指向注册视图的导航链接、一个指向忘记密码视图的导航链接和一个登录按钮。我可以选择任一文本字段并输入文本,但是在将文本输入任一文本字段后尝试按视图上的任何其他控件(文本字段或导航链接),只会冻结应用程序而不会在控制台窗口中记录任何错误消息。

我在其他与旧版本 Xcode / swift 相关的帖子中看到,这种行为可以通过在主线程上执行的连续循环来解释,但是我看不出这在我的情况下如何应用?

struct LoginForm : View 

    @Binding var emailAddress :  String
    @Binding var password: String

    var body: some View

        VStack(alignment: .leading)

            Text("Email address")
                .foregroundColor(Color.black)
                .bold()
                .font(.subheadline)
                .padding(.leading, 12)
            TextField("Email",text:$emailAddress)
                .padding()


            Text("Password")
                .foregroundColor(Color.black)
                .bold()
                .font(.subheadline)
                .padding(.leading, 12)
            SecureField("Password",text:$password)
                .padding()

        


    






struct LoginRootView : View 

    @State private var emailAddress: String = ""
    @State private var password: String = ""
    @EnvironmentObject var authData: AuthData


    var body: some View 


        Group

            if self.authData.authenticationDidSucceed 

                OnBoardRootView()

            else

                NavigationView

                    ZStack

                        Image("LoginBG")
                            .resizable()
                            .aspectRatio( contentMode: .fill)
                            .edgesIgnoringSafeArea(.all)
                            .opacity(0.5)


                        VStack(alignment: .leading)


                            Text( "Log into")
                                .font(.largeTitle)
                                .bold()


                            Text( "your account")
                                .font(.largeTitle)
                                .bold()


                                LoginForm(emailAddress:$emailAddress, password:$password)
                                    .padding(.bottom, 8)
                                    .padding(.top, 22)






                            //Login button

                            if emailAddress != "" && password != ""

                                LoginButton(email:self.emailAddress, password: self.password)
                                    .padding(.vertical, 20.0)
                                    .background(Color.blue, cornerRadius: 30.0)
                                    .padding(.horizontal, 8)


                            else

                                LoginButton(email:self.emailAddress, password: self.password)
                                    .padding(.vertical, 20.0)
                                    .background(Color.gray, cornerRadius: 30.0)
                                    .padding(.horizontal, 8)
                                    .disabled(emailAddress == "" || password == "")


                            




                            //Forgot password link

                            HStack

                                Text( "Forgot password?")


                                NavigationLink(destination: ForgotPasswordRootView()) 
                                    Text( "Get help signing in")
                                        .bold()

                                

                            .padding(.top, 20)


                            Spacer()

                            // Registration Link

                            HStack

                                Text( "Don't have an account? ")

                                NavigationLink(destination: RegistrationRootView()) 
                                    Text( "Sign Up")
                                        .bold()

                                

                            
                            .padding(.bottom, 120)


                        .padding(.all)
                            .padding(.top, 160)

                        // end of vstack


                    

                    //end of zstack

                
                //end of navigation view





            
            //end of authentication if statement



        
        //end of group




    






【问题讨论】:

我观察到了同样的情况,但它总是发生在模拟器上,而不是真实的设备上。此外,我从 beta 5 开始才遇到过这个问题,而且只在 Mojave 中遇到过。但是我最近没有太多使用 Catalina,所以这可能只是一个巧合。 根据您的观察,我重建了应用程序并在不同的模拟器(Xr 而不是 Xs)上运行它,虽然看起来“冻结”已经停止,但我在控制台中收到了这条消息—— - [SwiftUI] 在视图更新期间修改状态,这将导致未定义的行为。 我用 Xr 模拟器尝试了你的代码,我只看到过一次“修改状态...”错误,在我重建并重新运行多次后,错误停止显示。这绝对是一个错误。 我想我们将不得不等待 beta 6 并立即处理它:) 我发现在移动焦点之前输入回车不会锁定。我已提交反馈 (FB6910681) 但未收到回复。 【参考方案1】:

你必须重置模拟器。

模拟器:

硬件 -> 删除所有内容和设置

Xcode:

    进行干净的构建 运行

【讨论】:

【参考方案2】:

重启模拟器即可解决问题。

Simulator -> Hardware -> Restart

【讨论】:

以上是关于尝试在同一视图上的文本字段之间移动后,SwiftUI 应用程序在控制台中冻结且没有错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在文本字段中实现“使用键盘移动视图”功能

无法关闭文本字段上的键盘

同一屏幕上的子视图控制器之间的 IOS 转换

在视图控制器之间移动信息

如何在同一个视图控制器上分割文本字段(swift 3)

如果键盘阻止了文本视图,则移动 UIView