文本字段点击正在关闭 SwiftUI 中的导航链接

Posted

技术标签:

【中文标题】文本字段点击正在关闭 SwiftUI 中的导航链接【英文标题】:Textfield tap is dismissing navigation link in SwiftUI 【发布时间】:2021-06-13 19:52:45 【问题描述】:

我在使用 SwiftUI 的文本字段和导航视图/链接方面遇到了一个奇怪的问题

我所做的只是使用导航链接在视图中导航,并且在目标视图内有一些文本字段。当我点击其中任何一个时,导航会自动消失。

当点击文本字段并显示键盘时,如何修复导航链接不消失?

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)

【问题讨论】:

您好,您找到解决方案了吗? 还没有,可能是bug什么的。我更改了入职流程以解决该问题。 我面临同样的错误,我的场景中没有任何 viewModel 【参考方案1】:

ios 14.5 及更高版本似乎存在问题,点击 NavigationLink 目标内的任何 TextField 会使视图弹出到前一个。

感谢@SeitenWerk 提供了一种解决方法,并记录在 Apple 开发者论坛上

https://developer.apple.com/forums/thread/677333

解决方案很简单。只需在失败的导航链接旁边添加一个空导航链接。有趣的是,它会记录“无法呈现。请提交错误”。在调试控制台上,但通过应用程序的可用性使事情变得正确

NavigationLink(destination: LoginView())
    Text("LOGIN")

NavigationLink(destination: EmptyView()) 
     EmptyView()

记得在开发者论坛上感谢 SeitenWerk。

【讨论】:

iOS 15 不再工作 @SimonePistecchia 我刚刚在 iOS 15.1 中对其进行了测试并且工作正常。您的情况如何?【参考方案2】:

经过一段时间的研究,我发现 NavigationLink 关闭是因为 viewModel 中的 authViewPushed 参数变为 false。发生这种情况是因为由于 firstView 更新而重新创建了 viewModel。我遇到了同样的问题,这里是解决方案:

struct MyView: View 
    @StateObject var viewModel = MyViewModel()

    var body : some View 
        
    

在这种情况下,MyView 正在更新,但 MyViewModel 保持不变。

【讨论】:

【参考方案3】:

在 iOS 15 上

NavigationView 
    //your staff          

.navigationViewStyle(StackNavigationViewStyle())

【讨论】:

以上是关于文本字段点击正在关闭 SwiftUI 中的导航链接的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift ui watch os中的同一屏幕中添加键盘和文本字段[关闭]

如果堆栈大小> 1,则弹出后 SwiftUI3 导航链接不起作用

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

SwiftUI 文本字段中的可选链接绑定值

SwiftUI:在 iOS 14 上点击返回时导航链接崩溃,但在 iOS 13 上没有

键盘处理 swiftui