Textfield tap 在 SwiftUI 中取消导航 link
Textfield tap is dismissing navigation link in SwiftUI
我在使用 SwiftUI
时遇到了文本字段和导航 view/link 的奇怪问题
我所做的就是使用导航 links 在视图中导航,在目标视图中有一些文本字段。当我点击其中任何一个时,导航会自动关闭。
如何解决导航 link 在点击文本字段并出现键盘时关闭的问题?
var emailLoginButton: some View {
NavigationLink(destination: LoginView(viewModel: .init(mode: .login, isPushed: $viewModel.authViewPushed)), isActive: $viewModel.authViewPushed) {
Button(action: { viewModel.authViewPushed = true }) {
HStack {
Image(systemName: "envelope")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 20, height: 20)
.foregroundColor(.white)
Text("continue_with_email".localized())
.padding(.horizontal, 20)
}
}
.padding()
.frame(maxWidth: .infinity)
.foregroundColor(.white)
.background(Capsule().fill(Color.primaryPurple))
.shadow(color: Color.black.opacity(0.15), radius: 5, x: 5, y: 5)
.padding(.horizontal)
.padding(.bottom, 20)
}
.isDetailLink(false)
}
// Destination's view textfield which "dismisses" navigationLink
var emailTextField: some View {
HStack {
Image(systemName: "envelope")
.font(.title2)
.foregroundColor(.primary)
.frame(width: 35)
TextField(viewModel.emailPlaceholderText.uppercased(), text: $viewModel.email)
.autocapitalization(.none)
}
.padding()
.background(Color.white.opacity(viewModel.email == stringEmpty ? 0 : 0.12))
.cornerRadius(12)
.padding(.horizontal)
}
经过一段时间的研究,我发现 NavigationLink 关闭是因为 viewModel 中的 authViewPushed 参数变为假。发生这种情况是因为 viewModel 由于 firstView 更新而被重新创建。我遇到了同样的问题,这是解决方案:
struct MyView: View {
@StateObject var viewModel = MyViewModel()
var body : some View {
}
}
在这种情况下,MyView 正在更新,但 MyViewModel 保持不变。
iOS 14.5 及更高版本似乎存在一个问题,即在 NavigationLink 目标内点击任何 TextField 会使视图弹出到前一个。
感谢@SeitenWerk 并在 Apple 开发者论坛上记录了一个解决方法
https://developer.apple.com/forums/thread/677333
解决方法很简单。只需在失败的 NavigationLink 旁边添加一个空的 NavigationLink。有趣的是,它记录“无法呈现。请提交错误。”在调试控制台上,但通过应用程序的可用性使事情变得正确
NavigationLink(destination: LoginView()){
Text("LOGIN")
}
NavigationLink(destination: EmptyView()) {
EmptyView()
}
记得在开发者论坛上感谢 SeitenWerk。
在 iOS 15
NavigationView {
//your staff
}
.navigationViewStyle(StackNavigationViewStyle())
这可能是我最近在 SwiftUI 中看到的“这适用于任何其他版本的任何其他版本”的最令人沮丧和令人震惊的例子之一。 (叹气)我正在两个视图上重新设计整个工作流程,只是为了支持 iOS 的以前版本,而我最初并没有打算这样做。 Grrrr...是否有任何已知的解决方法一直被证明有效?
我在使用 SwiftUI
时遇到了文本字段和导航 view/link 的奇怪问题我所做的就是使用导航 links 在视图中导航,在目标视图中有一些文本字段。当我点击其中任何一个时,导航会自动关闭。
如何解决导航 link 在点击文本字段并出现键盘时关闭的问题?
var emailLoginButton: some View {
NavigationLink(destination: LoginView(viewModel: .init(mode: .login, isPushed: $viewModel.authViewPushed)), isActive: $viewModel.authViewPushed) {
Button(action: { viewModel.authViewPushed = true }) {
HStack {
Image(systemName: "envelope")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 20, height: 20)
.foregroundColor(.white)
Text("continue_with_email".localized())
.padding(.horizontal, 20)
}
}
.padding()
.frame(maxWidth: .infinity)
.foregroundColor(.white)
.background(Capsule().fill(Color.primaryPurple))
.shadow(color: Color.black.opacity(0.15), radius: 5, x: 5, y: 5)
.padding(.horizontal)
.padding(.bottom, 20)
}
.isDetailLink(false)
}
// Destination's view textfield which "dismisses" navigationLink
var emailTextField: some View {
HStack {
Image(systemName: "envelope")
.font(.title2)
.foregroundColor(.primary)
.frame(width: 35)
TextField(viewModel.emailPlaceholderText.uppercased(), text: $viewModel.email)
.autocapitalization(.none)
}
.padding()
.background(Color.white.opacity(viewModel.email == stringEmpty ? 0 : 0.12))
.cornerRadius(12)
.padding(.horizontal)
}
经过一段时间的研究,我发现 NavigationLink 关闭是因为 viewModel 中的 authViewPushed 参数变为假。发生这种情况是因为 viewModel 由于 firstView 更新而被重新创建。我遇到了同样的问题,这是解决方案:
struct MyView: View {
@StateObject var viewModel = MyViewModel()
var body : some View {
}
}
在这种情况下,MyView 正在更新,但 MyViewModel 保持不变。
iOS 14.5 及更高版本似乎存在一个问题,即在 NavigationLink 目标内点击任何 TextField 会使视图弹出到前一个。
感谢@SeitenWerk 并在 Apple 开发者论坛上记录了一个解决方法
https://developer.apple.com/forums/thread/677333
解决方法很简单。只需在失败的 NavigationLink 旁边添加一个空的 NavigationLink。有趣的是,它记录“无法呈现。请提交错误。”在调试控制台上,但通过应用程序的可用性使事情变得正确
NavigationLink(destination: LoginView()){
Text("LOGIN")
}
NavigationLink(destination: EmptyView()) {
EmptyView()
}
记得在开发者论坛上感谢 SeitenWerk。
在 iOS 15
NavigationView {
//your staff
}
.navigationViewStyle(StackNavigationViewStyle())
这可能是我最近在 SwiftUI 中看到的“这适用于任何其他版本的任何其他版本”的最令人沮丧和令人震惊的例子之一。 (叹气)我正在两个视图上重新设计整个工作流程,只是为了支持 iOS 的以前版本,而我最初并没有打算这样做。 Grrrr...是否有任何已知的解决方法一直被证明有效?