vlambda博客
学习文章列表

SwiftUI实现Textfield输入键盘自动隐藏

对于输入框来说,通过限定keyboard的类型,可以设置数值型的键盘类型,比如:

TextField("输入数字", text: $keystr)

.keyboardType(UIKeyboardType.numberPad) 


键盘类型如下,这个键盘,是没有完成按钮的,要隐藏这个键盘就比较麻烦。

查了很多资料,网上的例子很多,但基本上都是针对UIKit的通过viewcontroller的UITextField的delegate来实现的,对于swiftUI来说不适用。


现在给大家分享一个好用的方法:


首先在存在textfield输入框的swiftUI的页面调用如下语句,对View进

行扩展。


extension View {

    func endEditing() {

        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)

    }

}


然后在ContentView中,按照以下方式进行编写。


稍微解释一下:

1、通过keyboardType(UIKeyboardType.numberPad) 限定输入的内容,

有些键盘是存在完成按钮的,那就没有必要通过这个逻辑进行隐藏。

2、通过contentShape(Rectangle())和onLongPressGesture来获取viewcontainer

3、通过onTapGesture避免焦点冻结。

4、在点击空白时会自动出发endEditing事件,实现键盘隐藏。


struct ContentView: View {

    @State var keystr = ""

    var body: some View {

        TextField("输入UN编码", text: $keystr)

         .keyboardType(UIKeyboardType.numberPad) 

         .foregroundColor(.blue)

         .contentShape(Rectangle())

         .onTapGesture {}                        

         .onLongPressGesture(                   

         pressing: { isPressed in if isPressed { self.endEditing() } },

         perform: {})


}

}



最终实现的效果是,在输入框中点击一次出现键盘,再次点击键盘隐藏。