UITextField rightViewMode странное поведение - PullRequest
11 голосов
/ 13 сентября 2011

Я добавляю пользовательскую кнопку очистки (UIButton) в UITextField как rightView, однако я обнаружил, что в viewMode есть странное поведение.Кажется, он не отображается как обычная кнопка очистки, несмотря на установленный режим просмотра.Пример кода ниже:

UITextField *f = [[[UITextField alloc] init] autorelease];
f.frame = CGRectMake(0, 0, 300, 44);
f.backgroundColor = [UIColor clearColor];
f.textColor = [UIColor whiteColor];

f.clearButtonMode = UITextFieldViewModeNever;

UIImage *image = [UIImage imageNamed:@"Image.png"];

UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
b.frame = CGRectMake(0, 0, image.size.width, image.size.height);
[b setImage:image forState:UIControlStateNormal];

f.rightView = b;
f.rightViewMode = UITextFieldViewModeWhileEditing;

Кнопка отображается правильно в следующих состояниях:

  • Показывает, когда сфокусировано и без текста
  • Показывает, когда сфокусировано и печатает
  • Скрывается, когда нет фокуса

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

Я не нашел никого другого с этой проблемой, поэтому какое-то время царапал ему голову.Любая потеря света очень ценится.

Ответы [ 3 ]

8 голосов
/ 01 октября 2012

Это исправляет ошибку:

- (BOOL)becomeFirstResponder
{
    BOOL ret = YES ;

    ret = [super becomeFirstResponder] ;

    if( ret && ( _setupClearButtonMode == UITextFieldViewModeWhileEditing ) )
        self.rightViewMode = UITextFieldViewModeAlways ;

    return ret ;
}

- (BOOL)resignFirstResponder
{
    BOOL ret = YES ;

    ret = [super resignFirstResponder] ;

    if( ret && ( _setupClearButtonMode == UITextFieldViewModeWhileEditing ) )
        self.rightViewMode = UITextFieldViewModeWhileEditing ;

    return ret ;
}

В вашем подклассе UITextField с параметром var _setupClearButtonMode, установленным для init.

1 голос
/ 23 апреля 2014

Простой код для решения этой проблемы

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    textField.rightViewMode=UITextFieldViewModeAlways;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
     textField.rightViewMode=UITextFieldViewModeNever;
    return YES;
}
1 голос
/ 01 октября 2011

Недавно я столкнулся с той же проблемой и закончил тем, что установил правильный режим просмотра UITextFieldViewModeAlways и вручную показывал / скрывал эту кнопку, когда это необходимо (сделал делегат прокси, который отслеживал состояние текстового поля, устанавливал видимость кнопки и передавал сообщения фактическому делегату).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...