Определить потерянный фокус UITextField - PullRequest
13 голосов
/ 16 июня 2011

Я много искал и гуглил, но ничего полезного.

У меня есть два текстовых поля, и я не могу распознать, какое из них потеряло фокус.
Я перепробовал все варианты, но ничего.

Здесь 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 ]

3 голосов
/ 16 июня 2011

Для обработки касания за пределами текстовых полей вы можете переопределить 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
    }

    ...
}
2 голосов
/ 16 июня 2011
 - (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, например: 0,12,3 .... и т.д.

0 голосов
/ 12 октября 2014

Это не прямой ответ, так как вы спросили о том, как справиться с потерей фокуса. Я думаю, что бывают моменты, когда неплохо иметь явные кнопки сохранения и отмены, которые нужно отменить. Особенно в текстовом представлении, где вы хотите сохранить ключ возврата для его предполагаемого использования.

Это класс, который добавляет на клавиатуру панель инструментов с кнопками «Готово» и «Отмена». У меня это работает в 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
0 голосов
/ 16 июня 2011

Когда вы создаете текстовые поля, присвойте им разные теги:

#define kSomeTag 100
textField.tag = kSomeTag;

В вашем - (void) textFieldDidEndEditing: (UITextField *) метод textField вы можете определить, какое текстовое поле закончило редактирование, запросив его тег:

if (textField.tag == kSomeTag) {
    // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...