微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Textfield tap 正在关闭 SwiftUI 中的导航链接

如何解决Textfield tap 正在关闭 SwiftUI 中的导航链接

我在使用 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)
}

解决方法

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

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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。