Swiftui 如何修复选择器导航只有在我长按链接时才起作用

Swiftui 如何修复选择器导航只有在我长按链接时才起作用,swiftui,Swiftui,我目前正在使用SwiftUI开发一个应用程序 当我在NavigationView的Form中使用ontapsignature时,Picker内部的导航不起作用 但只有当我长按链接(如longpress手势)时,它才起作用 如果我不使用ontapsignate,Picker的导航功能正常,但在这种情况下,当我使用TextField选择numberPad作为键盘类型时,我无法关闭键盘 我怎样才能解决这个问题 下面是一个代码: OnTapGestureTest.swift import SwiftU

我目前正在使用SwiftUI开发一个应用程序

当我在
NavigationView
Form
中使用
ontapsignature
时,
Picker
内部的导航不起作用

但只有当我长按链接(如
longpress手势)时,它才起作用

如果我不使用
ontapsignate
Picker
的导航功能正常,但在这种情况下,当我使用
TextField
选择
numberPad
作为
键盘类型时,我无法关闭键盘

我怎样才能解决这个问题


下面是一个代码:

OnTapGestureTest.swift

import SwiftUI

struct OnTapGestureTest: View{
    
    @State var inputNo:String = ""
    @State var selectNo:Int = 0
    
    var body: some View {
        NavigationView{
            Form{
                TextField("InputNo", text: $inputNo)
                    .keyboardType(.numberPad)
                
                Picker(selection:$selectNo, label: Text("SelectNo")){
                    Text("0").tag(0)
                    Text("1").tag(1)
                    Text("2").tag(2)
                    Text("3").tag(3)
                    Text("4").tag(4)
                    Text("5").tag(5)
                    
                }
            }
            .onTapGesture {
                UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
            }
        }
    }
}

已更新

我试图通过引用来解决我的问题

*在iOS 13.0中,我只想在点击外部时关闭键盘(不处理拖动)

斯威夫特美术馆

...
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
...
        let tapGesture = UITapGestureRecognizer(target: window, action:#selector(UIView.endEditing))
        tapGesture.requiresExclusiveTouchType = false
        tapGesture.cancelsTouchesInView = false
        tapGesture.delegate = self 
        window?.addGestureRecognizer(tapGesture)
    }
...
但它仍然不能很好地工作。。。我需要做更多的事情吗?误解了答案


Xcode:12.0.1版


iOS:13.0

您可以在
UIWindow
的帮助下全局添加点击手势:

extension UIApplication {
    
    func addTapGestureRecognizer() {
        guard let window = windows.first else { return }
        let tapGesture = UITapGestureRecognizer(target: window, action: #selector(UIView.endEditing))
        tapGesture.requiresExclusiveTouchType = false
        tapGesture.cancelsTouchesInView = false
        tapGesture.delegate = self
        window.addGestureRecognizer(tapGesture)
    }
}


extension UIApplication: UIGestureRecognizerDelegate {
    
    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true 
    }
}
在你的主要内容中:(想法:一旦你的应用程序启动,这个点击手势就会添加到窗口中)

这尤其方便,因为您不必再注意将键盘隐藏在视图中,并且它不会阻塞任何控件

注 此代码来自


此外,我还看到了iOS13-对于非SwiftUI循环,这将是等效的:

感谢您的帮助,我尝试通过引用此链接来执行一些解决方案
https://stackoverflow.com/a/60010955/8700044
就像我更新的问题一样。我是否需要在我的结构中添加一些代码
OnTapGestureTest.swift
?您是否从
表单中删除了轻触手势?
?不,我没有在
表单中更改任何内容。否则,您可以尝试使用我的解决方案进行SwiftUI循环。只需将
onAppear
添加到
SceneDelegate
中的初始视图中即可。应该是一样的。对我来说,它工作得很好。我删除了
tapperstate
,然后它工作得很好,非常感谢您的支持!
@main
struct YourApp: App {
    
    ...
    
    var body: some Scene {
        WindowGroup {
            //Your initial view
                .onAppear(perform: UIApplication.shared.addTapGestureRecognizer)
        }
    }
}