Подтвердить что ты не робот

UITextField - неправильное поведение RightViewMode

Я добавляю пользовательскую кнопку очистки (UIButton) в UITextField как правое, но я обнаружил там какое-то странное поведение на 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;

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

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

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

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

4b9b3361

Ответ 1

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

- (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.

Ответ 2

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

Ответ 3

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

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

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
     textField.rightViewMode=UITextFieldViewModeNever;
    return YES;
}