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