UITextField rightView "WhileEditing" проблема - PullRequest
6 голосов
/ 23 августа 2011

Я пытаюсь создать подкласс UITextField следующим образом для реализации пользовательского правого просмотра в виде кнопки Очистить:

-(void) drawRect:(CGRect)rect
{

    [self.layer setBackgroundColor:[[UIColor colorWithRed:20.0/255.0 green:20.0/255.0 blue:20.0/255.0 alpha:1] CGColor]];
    [self.layer setCornerRadius:15.0];

    UIImage  *imgClear = [UIImage imageNamed:@"btnClear"];
    CGSize iSize = [imgClear size];

    UIButton *clearButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, iSize.width, iSize.height)];

    [clearButton setImage:imgClear forState:UIControlStateNormal];
    [clearButton addTarget:self action:@selector(clearText:) forControlEvents:UIControlEventTouchUpInside];

    [self setRightViewMode:UITextFieldViewModeWhileEditing];
    [self setRightView:clearButton];

    [clearButton release];
}

но проблема в том, что когда текстовое поле просто становится фокусом, кнопка «очистить» тоже становится видимой, и после того, как я начинаю нажимать на клавиатуру, она исчезает. Есть идеи?

Ответы [ 6 ]

5 голосов
/ 25 декабря 2012

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

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    ...
    [self addTarget:self action:@selector(onEditing:) forControlEvents: UIControlEventEditingChanged]
    ...
}

-(void) onEditing:(id)sender {
    if(![self.text isEqualToString:@""]){
        self.rightViewMode = UITextFieldViewModeAlways;
    }else{
        self.rightViewMode = UITextFieldViewModeNever;
    }
}
- (BOOL)becomeFirstResponder{
    BOOL ret = YES ;
    ret = [super becomeFirstResponder] ;
    if( ret & ![self.text isEqualToString:@""]){
        self.rightViewMode = UITextFieldViewModeAlways;
    }else{
        self.rightViewMode = UITextFieldViewModeNever;
    }

    return ret ;
}
- (BOOL)resignFirstResponder
{
    BOOL ret = YES ;
    ret = [super resignFirstResponder] ;
    if( ret )
        self.rightViewMode = UITextFieldViewModeNever;
    return ret ;
}
- (void) clearText:(id)sender
{
    self.text = @"";
    self.rightViewMode = UITextFieldViewModeNever;
}
3 голосов
/ 23 февраля 2012

Вы должны использовать: [self setRightViewMode:UITextFieldViewModeAlways];

1 голос
/ 09 мая 2013

Подкласс UITextField и переопределить -layoutSubviews.

- (void)layoutSubviews
{
   [super layoutSubviews];

   // HACK: There is an iOS bug where the right view is not displayed when there is text in the text field. Also, iOS adds and removes the rightView. This code adds the right view and uses hide-unhide instead.

   UIView *rightView = [self rightView];

   if (rightView != nil && [self clearButtonMode] == UITextFieldViewModeNever) {
      BOOL showRightView;
      BOOL isFirstResponder = [self isFirstResponder];

      switch ([self rightViewMode]) {
      case UITextFieldViewModeNever:
         showRightView = FALSE;
         break;
      case UITextFieldViewModeWhileEditing:
         showRightView = isFirstResponder;
         break;
      case UITextFieldViewModeUnlessEditing:
         showRightView = !isFirstResponder;
         break;
      case UITextFieldViewModeAlways:
      default:
         showRightView = TRUE;
         break;         
      }

      showRightView = (showRightView && ![[self text] isEqualToString:@""]);

      [rightView setFrame:[self rightViewRectForBounds:[self bounds]]];
      [rightView setHidden:!showRightView];

      [self addSubview:rightView];
   }
}
0 голосов
/ 17 июня 2015

Я написал класс с открытым исходным кодом, STAResizingTextField , который позволяет указывать пользовательские изображения кнопок в текстовом поле.

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

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

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

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
     textField.rightViewMode=UITextFieldViewModeNever;
    return YES;
}
0 голосов
/ 23 февраля 2012
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    UITextField *searchField = nil;
    for (UIView *subview in controller.searchBar.subviews) {
        DebugLog(@"%@",[subview description]);
        if ([subview isKindOfClass:[UITextField class]]) {
            searchField = (UITextField *)subview;
            UIImageView *clearIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ClearIcon.png"]];
            searchField.rightView = clearIconView;
            searchField.rightViewMode = UITextFieldViewModeAlways;

            [clearIconView release];
            break;
        }
    }
}
...