检测UITextField失去焦点

时间:2011-06-16 09:34:07

标签: iphone objective-c ipad uitextfield protocols

我搜索了很多谷歌搜索和heree,但没什么用处。

我有两个文本区域,我无法识别哪一个失去了焦点 我尝试了所有选项,但没有。

此处为textFieldDidEndEditing

- (void) textFieldDidEndEditing:(UITextField *)textField {  
  NSLog(@"%@", [textField state]);
  NSLog(@"%d", [textField isSelected]);
  NSLog(@"%d", [textField isFirstResponder]);
  NSLog(@"%d", [textField isHighlighted]);
  NSLog(@"%d", [textField isTouchInside]);

  if ( ![textField isFirstResponder] || ![textField isSelected] ) {
  //if ( [textField state] != UIControlStateSelected) {
    NSLog(@"not selected!");
    [...]
    // remove view / etc...
  }
}

所有NSLog都返回0!为什么呢?!?

如何检测丢失的焦点?每次按下键盘按钮时,此方法都会调用,不仅仅是在结尾! 还有其他选择吗?

修改
我不想从文本切换但我想在屏幕上点击任何时候检测丢失的焦点。 (键盘将关闭或不关闭,插入符号不在文本字段中)!

感谢。

4 个答案:

答案 0 :(得分:3)

要处理点击外部文本字段,您可以在视图控制器中覆盖touchesBegan

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event
{
    UITouch *touch = [[event allTouches] anyObject];
    if ([textField1 isFirstResponder] && (textField1 != touch.view))
    {
        // textField1 lost focus
    }

    if ([textField2 isFirstResponder] && (textField2 != touch.view))
    {
        // textField2 lost focus
    }

    ...
}

答案 1 :(得分:2)

 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
      NSLog(@"%d",textFiled.tag);
      NSInteger nextTag = textField.tag + 1;
      UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];   
      if (nextResponder) {
          [nextResponder becomeFirstResponder];
      } else {          
          [textField resignFirstResponder];
      }
      return YES;
  }

带有标记的UITextField在textFieldShouldReturn方法中失去了焦点

这将帮助您从一个TextField转到另一个...只需在所有TextFields ex:0,1,2,3 ....等中设置标签

答案 2 :(得分:0)

这不是一个直接的答案,因为你问到失去焦点时如何处理。我认为有时候有明确的保存和取消按钮可以解雇。特别是在文本视图中,您希望保留返回键以用于其预期用途。

这是一个为键盘添加工具栏的类,其中包含"完成"和"取消"纽扣。我现在正在iOS 8中工作。我对iOS很陌生,所以可能有更好的方法来做到这一点。始终接受有关如何改进的建议。

... DismissableTextView.h

#import <UIKit/UIKit.h>

@interface DismissableTextView : UITextView

@end

... DismissableTextView.m

#import "DismissableTextView.h"

@implementation DismissableTextView

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self setInputView];
    }
    return self;
}

- (id) initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        [self setInputView];
    }
    return self;
}

- (void)awakeFromNib
{
    [super awakeFromNib];
    [self setInputView];
}

- (void) setInputView {
    [self createToolbar];
}
-(void) createToolbar {

    // Create toolbar for the keyboard so it can be dismissed...
    UIToolbar* toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    toolbar.barStyle = UIBarStyleDefault;
    toolbar.items = [NSArray arrayWithObjects:
                           [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(cancelClicked)],
                           [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                           [[UIBarButtonItem alloc]initWithTitle:@"Apply" style:UIBarButtonItemStyleDone target:self action:@selector(doneClicked)],
                           nil];
    [toolbar sizeToFit];

    self.inputAccessoryView = toolbar;
}

- (IBAction)didBeginEditDescription:(id)sender
{
}

-(void)cancelClicked{

    // respond to cancel click in the toolbar
    [self resignFirstResponder];
}

-(void)doneClicked{

    // respond to done click in the toolbar
    [self resignFirstResponder];
}

@end

答案 3 :(得分:-3)

创建文本字段时,请为其指定不同的标记:

#define kSomeTag 100
textField.tag = kSomeTag;

在 - (void)textFieldDidEndEditing:(UITextField *)textField方法中,您可以通过查询其标记来判断哪个文本字段已结束编辑:

if (textField.tag == kSomeTag) {
    // do something
}
相关问题