52

今天我试图在我的 iPod (iOS 6.1.3) 上运行我的代码,我在这里发现了一些有趣的东西......

首先,当我点击文本字段时,键盘会出现,但当我点击文本字段外的其他地方时它不会隐藏。

所以我决定谷歌搜索并找到这个解决方案:

_fieldEmail.delegate = self;
_fieldEmail.returnKeyType = UIReturnKeyDone;

_fieldPassword.delegate = self;
_fieldPassword.returnKeyType = UIReturnKeyDone;

_fieldRegisterName.delegate = self;
_fieldRegisterName.returnKeyType = UIReturnKeyDone;

_fieldRegisterEmail.delegate = self;
_fieldRegisterEmail.returnKeyType = UIReturnKeyDone;

_fieldRegisterPassword.delegate = self;
_fieldRegisterPassword.returnKeyType = UIReturnKeyDone;

它有效...它在键盘底部提供了一个“完成”按钮,现在可以通过按下它来隐藏键盘。

但我在这里有两个问题:

  1. 键盘仅在点击“完成”按钮时隐藏。不是通过点击文本字段外的其他区域。我不知道这在 iOS 世界中是否正常,但通常我看到很多应用程序都不是这样的。
  2. 有没有办法循环这个过程,所以我没有手动添加我拥有的所有文本字段的委托?怎么做?

这就是我需要知道的

4

14 回答 14

83

下面的代码将适用于 UIView 中的所有组件UITextField

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UIView * txt in self.view.subviews){
        if ([txt isKindOfClass:[UITextField class]] && [txt isFirstResponder]) {
            [txt resignFirstResponder];
        }
    }
}

或者

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];    
}
于 2013-09-12T05:46:17.340 回答
30
  1. 只需将 UITapGestureRecogniser 添加到您的视图中即可调用resignFirstResponder

在 viewDidLoad :

UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] 
                                   initWithTarget:self
                                   action:@selector(hideKeyBoard)];

[self.view addGestureRecognizer:tapGesture];

接着 :

-(void)hideKeyBoard {
       [yourTextField resignFirstResponder];
}

2.您可以继承 UITextField,但除非您有 1000 个文本字段,否则可以像您目前所做的那样做。

于 2013-09-12T05:51:21.210 回答
19

这是关于 Xcode 6.0.1 的Swift编程

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleSingleTap:")
    tapRecognizer.numberOfTapsRequired = 1
    self.view.addGestureRecognizer(tapRecognizer)
}

func handleSingleTap(recognizer: UITapGestureRecognizer) {
    self.view.endEditing(true)
}
于 2014-10-15T13:10:47.047 回答
7

关闭键盘

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        [self.view endEditing:YES];
        [super touchesBegan:touches withEvent:event];
    }
于 2015-04-22T10:21:35.933 回答
7

使用任何一个

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];

和方法代码

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [self.TextFiledName resignFirstResponder];

}

OR _ 最好的其他选项是

只需添加

  [self.view endEditing:YES];

当您从视图中点击任何位置时,键盘将隐藏:)

于 2013-09-12T05:44:17.627 回答
4

简单的,

使用IQKeyboardManager并将这行代码放入 AppDelegate.m

[[IQKeyboardManager sharedManager] setShouldResignOnTouchOutside:YES];
于 2015-11-09T11:05:00.960 回答
3

我通常做的是打电话

[field resignFirstResponder]; 

从视图上方的不可见按钮。我确信有更好的方法来做到这一点。自从我在应用程序中完成此操作以来已经有一段时间了。

于 2013-09-12T05:43:59.013 回答
1

这是我的做法:

在 myView 的 .h 文件中:

@property (strong) UITextField * savedTextField;

在 myView 的 .m 文件中:

@implementation myView

@synthesize savedTextField;

在 myView 的初始化例程中:

[self setSavedTextField: nil];

在 myView 的 textField 委托区域中,我保存当前正在激活的任何 textField 的 id:

- (BOOL) textFieldShouldBeginEditing: (UITextField *) textField
   {
   [self setSavedTextField: textField];
   .
   .
   .
   return( YES );
   }

在 myView 的例程中,当其他控件被访问时路由所有流量,我有代码来查看 textField 是否处于活动状态,如果是,它会调用它以放弃其 FirstResponder 状态,然后删除一个nil 进入 savedTextField 属性:

- (void) handleCtrlEvents: (UIControl *) aCtrl
  {
  if ( [self savedTextField] != nil )
     {
     [[self savedTextField] resignFirstResponder];
     [self setSavedTextField: nil];
     }
  .
  .
  .
  }

这对我来说很干净。

于 2013-11-08T06:10:57.570 回答
1

我遇到了完全相同的问题。通常你想要的是,无论你在你的应用程序中点击什么(显示在你的主/当前 UIView 中),而不是在键盘上关闭它。在网上搜索了一个智能解决方案并测试了几个之后,我认为最好扩展/子类/实现 UIGestureRecognizerDelegate

由于 UITableView 等许多控件可以响应手势(选择、滚动等),如果您只是将 UITapGestureRecognizer 添加到整个(主)ViewController 的视图以关闭键盘,则用户体验并不是最好的,因为如果用户不打算关闭键盘,则需要点击两次,例如从应用程序当前“主”视图中的 UITableView 中选择一行。

由于我对整个 iOS 很陌生,而且 swift 的东西和swift 代码示例很少见,这里是我的全键盘控制截图:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

override func viewDidLoad(){
     self.initializeCloseKeyboardTap()
}

func initializeCloseKeyboardTap() {

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardOpen:", name: UIKeyboardDidShowNotification, object: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardClose:", name: UIKeyboardDidHideNotification, object: nil)
    let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleOnTapAnywhereButKeyboard:")
    tapRecognizer.delegate = self //delegate event notifications to this class
    self.view.addGestureRecognizer(tapRecognizer)

}


func onKeyboardClose(notification: NSNotification) {
    println("keyboardClosed")
}

func onKeyboardOpen(notification: NSNotification) {
    println("keyboardOpen")
}

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    self.view.endEditing(true)
    return false
}

您可以将其嵌套在 ViewController 中并在 viewDidLoad 实现中调用 initiallizeCloseKeyboardTa() ...

希望节省其他人一些时间:-)

于 2014-10-31T23:35:40.953 回答
1

我更喜欢IQKeyboardManager。您可以在任何状态下简单地处理键盘。要激活 IQKeyboard,只需在 AppDelegate 中添加一行并在外部触摸时关闭键盘,添加代码如下,

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  IQKeyboardManager.shared.enable = true
  IQKeyboardManager.shared.shouldResignOnTouchOutside = true

  return true
}
于 2020-05-15T13:10:23.537 回答
1

|*| 关闭 UITextField 的键盘:覆盖 ViewController 的 touchesBegan:withEvent: 方法

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
    view.endEditing(true)
    super.touchesBegan(touches, withEvent: event)
}

|或|

override func viewDidLoad()
{
    super.viewDidLoad()
// For tapping outside text box
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(DismisKeyPadFnc)))
}

// For tapping outside text box
func DismisKeyPadFnc()
{
    view.endEditing(true)
}

|*| 关闭单个文本框上的 UITextField 键盘:

class NamVcc: UIViewController, UITextFieldDelegate
{
    @IBOutlet var NamTxtBoxVid: UITextField!

    override func viewDidLoad()
    {
        super.viewDidLoad()

    // For hitting return key
        NamTxtBoxVid.delegate = self

    // For tapping outside text box
        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(DismisKeyPadFnc)))
    }

/* For hitting return key */
    func textFieldShouldReturn(NamTxtBoxPsgVid: UITextField) -> Bool
    {
        NamTxtBoxPsgVid.resignFirstResponder()
        return true
    }

/* For tapping outside text box */
    func DismisKeyPadFnc()
    {
        view.endEditing(true)
    }
}


|*| 实现下一步按钮单击:
1)您将需要在 xib/Storyboard 或代码中的文本字段的增量序列中设置标签。
2) 为每个文本字段设置委托。
3)然后将以下代码粘贴到您的视图控制器中以获得所需的效果:

func textFieldShouldReturn(TxtBoxPsgVar: UITextField) -> Bool
{
    let NxtTxtBoxTagVal : Int = TxtBoxPsgVar.tag + 1

    let NxtTxtBoxVal: UIResponder? = TxtBoxPsgVar.superview?.superview?.viewWithTag(NxtTxtBoxTagVal)

    if let TxtBoxVal = NxtTxtBoxVal
    {
        // Found next responder, so set it.
        TxtBoxVal.becomeFirstResponder()
    }
    else
    {
        // Not found, so remove keyboard.
        TxtBoxPsgVar.resignFirstResponder()
    }
    return true
}
于 2016-06-02T19:06:31.067 回答
0

我认为

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

很方便,但不是最好的解决方案。TapGestureRecongnizer 更好但很难使用,您必须设置委托并添加和删除 Recongnizer。所以我写了一个简单的子类,可以很容易地使用:

class TapHideTextField: UITextField {
override func awakeFromNib() {
    super.awakeFromNib()
    tapGr = UITapGestureRecognizer(target: self, action:"tap")
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBeginEditing", name:UITextFieldTextDidBeginEditingNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "didEndEditing", name:UITextFieldTextDidEndEditingNotification, object: nil)

}

deinit{
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

var tapGr:UITapGestureRecognizer!
func tap(){
    self.endEditing(true)
}

func didBeginEditing(){
    self.superview!.addGestureRecognizer(tapGr)
}


func didEndEditing(){
    self.superview!.removeGestureRecognizer(tapGr)
}

}

您应该关注 superview 和 cancelTouchesInView 属性。

或在 GitHub 中:https ://github.com/lilidan/TapHideText/blob/master/TapHideTextField.swift

于 2015-04-18T10:28:14.030 回答
0

如果您使用的是滚动视图(或表格视图)控制器,请在此处添加以下行:

    override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        view.endEditing(true)
    }
于 2020-02-16T20:05:46.197 回答
-1
-(void) textFieldDidBeginEditing: (UITextField *) textField{
     [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(DismissKeyboard:)]];
}

-(void) DismissKeyboard:(UITapGestureRecognizer *) sender{
    [self.view endEditing:YES];
    [self.view removeGestureRecognizer:sender];
}
于 2015-07-17T06:49:05.557 回答