25

我在 MyCustomUIView 类中有一个 UITextField,当 UITextField 失去焦点时,我想隐藏该字段并在适当的位置显示其他内容。

的委托UITextField设置为MyCustomUIView通过 IB,我还有 'Did End On Exit' 和 'Editing Did End' 事件指向IBAction.MyCustomUIView

@interface MyCustomUIView : UIView { 

IBOutlet UITextField    *myTextField;

}

-(IBAction)textFieldLostFocus:(UITextField *)textField;

@end

但是,当 UITextField 失去焦点时,这些事件似乎都不会被触发。你如何捕捉/寻找这个事件?

的代表UITextField设置为,MyCustomUIView因此我收到textFieldShouldReturn消息以在完成后关闭键盘。

但我也感兴趣的是确定用户何时按下屏幕上的其他区域(比如另一个控件或只是空白区域)并且文本字段失去焦点。

4

7 回答 7

30

尝试对以下方法使用委托:

- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"Lost Focus for content: %@", textField.text);
    return YES;
}

这对我有用。

于 2014-05-28T16:33:54.750 回答
15

我相信您需要将您的视图指定为 UITextField 委托,如下所示:

@interface MyCustomUIView : UIView <UITextFieldDelegate> { 

作为额外的奖励,这是当键盘按下“完成”或返回按钮时如何让键盘消失的方式,具体取决于您设置该属性的方式:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
  //This line dismisses the keyboard.       
  [theTextField resignFirstResponder];
  //Your view manipulation here if you moved the view up due to the keyboard etc.       
  return YES;
}
于 2009-07-15T20:38:12.640 回答
4

resignFirstResponder解决方案的问题在于,它只能由显式键盘UITextField事件触发。如果在文本字段之外的某个地方被点击,我也在寻找一个“失去焦点事件”来隐藏键盘。我遇到的唯一接近且实用的“解决方案”是,禁用其他视图的交互,直到用户完成编辑(在键盘上点击完成/返回),但仍然能够在文本字段之间跳转以进行更正而无需每次都需要滑出和滑入键盘。

以下片段可能对想要做同样事情的人有用:

// disable all views but textfields
// assign this action to all textfields in IB for the event "Editing Did Begin"
-(IBAction) lockKeyboard : (id) sender {

    for(UIView *v in [(UIView*)sender superview].subviews)
        if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO;
}

// reenable interactions
// assign this action to all textfields in IB for the event "Did End On Exit"
-(IBAction) disMissKeyboard : (id) sender {

    [(UIResponder*)sender resignFirstResponder]; // hide keyboard

    for(UIView *v in [(UIView*)sender superview].subviews)
        v.userInteractionEnabled = YES;
}
于 2011-04-13T09:28:55.107 回答
2

您可能必须继承UITextField和覆盖resignFirstResponderresignFirstResponder将在文本字段失去焦点时被调用。

于 2009-07-16T03:07:20.830 回答
1

我认为你已经实施UIKeyboardDidHideNotification了,在这种情况下你

使用类似的代码

[theTextField resignFirstResponder];

删除此代码。

同样的代码写入textFieldShouldReturn方法。这也失去了焦点。

于 2015-12-24T12:42:42.077 回答
0

对于那些在 Swift 中苦苦挣扎的人。我们将手势识别器添加到 ViewController 的视图中,以便在点击视图时关闭文本字段。重要的是不要取消对视图的后续点击。

斯威夫特 2.3

    override func viewDidLoad() {
        //.....

        let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:)))
        //this line is important
        viewTapGestureRec.cancelsTouchesInView = false
        self.view.addGestureRecognizer(viewTapGestureRec)

         //.....
    }

    func handleViewTap(recognizer: UIGestureRecognizer) {
        myTextField.resignFirstResponder()
    }
于 2016-10-27T19:02:53.693 回答
0

Swift中,您需要实现UITextFieldDelegate您的并从以下ViewController实现方法: textFieldDidEndEditingdelegate

class ViewController: UIViewController, UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        // will be called when the text field loses their focus
    }
}

然后你需要分配delegate你的textField

textField.delegate = self
于 2021-09-02T18:51:24.910 回答