Ios 触摸UITextField(swift)之外的任何位置时,如何关闭键盘?
我正在处理一个有UIViewController的项目,在视图控制器上有一个UIScrollView,在scrollview上有一个UITextField。 这样地: 在文本字段中键入一些文本并点击文本字段外的任何位置后,我试图关闭键盘并隐藏它。 我尝试了以下代码:Ios 触摸UITextField(swift)之外的任何位置时,如何关闭键盘?,ios,swift,uitextfield,uikeyboard,Ios,Swift,Uitextfield,Uikeyboard,我正在处理一个有UIViewController的项目,在视图控制器上有一个UIScrollView,在scrollview上有一个UITextField。 这样地: 在文本字段中键入一些文本并点击文本字段外的任何位置后,我试图关闭键盘并隐藏它。 我尝试了以下代码: override func viewDidLoad() { super.viewDidLoad() self.textField.delegate = self; } override func touchesBe
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self;
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
override func viewDidLoad(){
super.viewDidLoad()
self.textField.delegate=self;
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
self.view.endEditing(true)
}
当我点击scrollview外部时,它对我有效,但当我点击scrollview时,什么都不会发生,键盘也不会隐藏
在文本字段外的任何地方点击时,是否有办法关闭键盘?
谢谢在这种情况下,有一种选择是UITAPPORATE。我试图创建示例代码以防万一。像这样,
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let tapGesture = UITapGestureRecognizer(target: self, action: "tap:")
view.addGestureRecognizer(tapGesture)
}
func tap(gesture: UITapGestureRecognizer) {
textField.resignFirstResponder()
}
}
我在Obj-C中创建了此方法,无论用户当前在何处键入,该方法都会隐藏键盘:
//call this method
+ (void)hideKeyboard {
//grab the main window of the application
UIWindow *window = [UIApplication sharedApplication].keyWindow;
//call our recursive method below
[self resignResponderForView:window];
}
//our recursive method
+ (void)resignResponderForView:(UIView *)view {
//resign responder from this view
//If it has the keyboard, then it will hide the keyboard
[view resignFirstResponder];
//if it has no subviews, then return back up the stack
if (view.subviews.count == 0)
return;
//go through all of its subviews
for (UIView *subview in view.subviews) {
//recursively call the method on those subviews
[self resignResponderForView:subview];
}
}
我希望这能转化为Swift,并且有意义。它可以在应用程序中的任何位置调用,并且无论您使用的是哪种VC或任何东西,它都会隐藏键盘。转到键盘类型,然后选择默认值或需要文本字段的任何内容。然后重写一个方法,你想怎么叫就怎么叫,我通常叫它touchingsbegins。下面是您忘记添加的内容
super.touchingBegins(touches, withEvent: event)
}
试试这个,它已经过测试并且可以工作了: 适用于Swift 3.0/4.0
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
self.view.endEditing(true)
}
适用于较老的Swift
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
self.view.endEditing(true)
}
override func touchsbegined(touchs:Set,withEvent-event:UIEvent){
self.view.endEditing(true)
}
我也遇到了同样的问题,我终于解决了
在故事板中设置TapGestureRecognitor,然后在ViewController中设置插座
@IBOutlet var tapGesture: UITapGestureRecognizer!
@IBAction func DismissKeyboard(sender: UITapGestureRecognizer)
{
self.view.endEditing(true)
}
然后在ViewController中设置iAction
@IBOutlet var tapGesture: UITapGestureRecognizer!
@IBAction func DismissKeyboard(sender: UITapGestureRecognizer)
{
self.view.endEditing(true)
}
将这些行添加到viewDidLoad方法中
override func viewDidLoad()
{
super.viewDidLoad()
self.view.addGestureRecognizer(tapGesture)
}
它应该会起作用
希望这会有帮助 为Swift 4编辑 编辑:添加了
@objc
。虽然这不是性能的最佳选择,但在没有更好的解决方案之前,这里的一个实例不应该导致太多问题
当需要与GestureRecognizer后面的项目交互时,编辑以修复此问题。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//Key borad dismiss
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
//Key board hide on outside the textfield
@objc func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}
}
编辑:感谢@Rao指出这一点。添加了tap.cancelsTouchesInView=false
这将有助于您拥有多个UITextView
或UITextField
创建视图控制器的扩展。对我来说,这比尝试使用.resignFirstResponder()
在视图中调用self.setupToHideKeyboardOnTapOnView()
每次触摸不同的文本字段都会关闭键盘或使用辞职第一响应程序
extension UIViewController
{
func setupToHideKeyboardOnTapOnView()
{
let tap: UITapGestureRecognizer = UITapGestureRecognizer(
target: self,
action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard()
{
view.endEditing(true)
}
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
if(![touch.view isMemberOfClass:[UITextField class]]) {
[touch.view endEditing:YES];
}
}
当在输入区域外触摸任意数量的输入项时,此功能起作用
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
覆盖函数触摸开始(触摸:设置,withEvent事件:UIEvent?){
self.view.endEditing(true)
}
引入轻触手势识别器,并为其设置和操作
使用以下代码:
nameofyourtextfield.resignfirstresponder()使用ScrollView的Swift 3工作解决方案
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
// The next line is the crucial part
// The action is where Swift 3 varies from previous versions
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tap(gesture:)))
self.view.addGestureRecognizer(tapGesture)
}
func tap(gesture: UITapGestureRecognizer) {
textField.resignFirstResponder()
}
}
另一个是关于这个问题的,我引用和使用的。公认的答案在Swift 3中不再有效。当前选择的答案应为以下答案。详细信息
- 代码10.2.1(10E1001),Swift 5
override func viewDidLoad() {
var tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))
self.view.userInteractionEnabled = true
self.view.addGestureRecognizer(tapGesture)
}
那么您的点击处理程序是
func handleTap(sender: UITapGestureRecognizer) {
self.view.endEditing(true)
}
斯威夫特3
override func viewDidLoad() {
super.viewDidLoad()
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
}
斯威夫特3
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
self.view.endEditing(true)
}
//在swift 4中……它对我很有用
func setupKeyboardDismissRecognizer(){
let tapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(searchingActivity.dismissKeyboard))
self.view.addGestureRecognizer(tapRecognizer)
}
@objc func dismissKeyboard()
{
view.endEditing(true)
searchTableView.isHidden = true
}
//在Swift4中的viewDidLoad中调用此函数setupKeyboardDismissRecognizer()
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
self.view.endEditing(true)
}
在Swift 4或5中,您可以像..
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//Key borad dismiss
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
//Key board hide on outside the textfield
@objc func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}
}
我在Swift 4中使用了以下代码,你可以试试这个
override func viewDidLoad() {
super.viewDidLoad()
// dismiss keyboard when tap outside a text field
let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewControllerName.dismissKeyboard))
view.addGestureRecognizer(tapGestureRecognizer)
}
//Calls this function when the tap is recognized.
func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}
谢谢,成功了。但我还有一个问题,我有一个视图控制器,有5个文本字段。有没有一个好方法可以让他们不用逐个调用“resignFirstResponder”方法来执行相同的操作?另一个问题,当我点击文本字段外的任何位置时,有没有方法可以关闭键盘?例如,当我点击一个按钮时?@white hat能否将该问题作为另一个问题提问?@white hat将您的5个文本字段放入outlet集合中。然后创建一个dismissKeyboard方法,该方法迭代集合并在每个文本字段上调用resignFirstResponder。您可以从手势识别器和按钮操作调用此方法。@WhiteHat ViewController.View可以调用EndedTing在点击UIScrollViewNote时对我不起作用的方法此方法已更改为覆盖func ToucheSBegind(触摸:设置,withEvent事件:UIEvent?)迅速地2@WhiteHat请参阅上面的我的答案,了解与ScrollView配合使用的Swift 3答案此答案也适用于Swift 4!!谢谢。@Hemang正如@Rao在对已接受答案的评论中所述,当您有TableView时,您需要添加
tap.cancelsTouchesInView=false
。希望有帮助。你可能想退房。@JoeBlow我相信你错了。你应该辞去textField的第一响应者的职务。不是风景。我在当前项目中有这段代码,并在一个新项目中测试了它。更不用说,我的答案只是Pixyzehn.hey dev@Devbot10所写答案的更新版本——请毫不犹豫地将其编辑回你之前的版本。你知道,我可能很困惑
func setupKeyboardDismissRecognizer(){
let tapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(searchingActivity.dismissKeyboard))
self.view.addGestureRecognizer(tapRecognizer)
}
@objc func dismissKeyboard()
{
view.endEditing(true)
searchTableView.isHidden = true
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//Key borad dismiss
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
//Key board hide on outside the textfield
@objc func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// dismiss keyboard when tap outside a text field
let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewControllerName.dismissKeyboard))
view.addGestureRecognizer(tapGestureRecognizer)
}
//Calls this function when the tap is recognized.
func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}