UITextField rightView “WhileEditing” problem

旧街凉风 提交于 2019-11-30 20:36:50

I meet the same problem, too. I guess this is an iOS bug, however, I tried to fix this problem by following implementations and it works fine for me. Hope this will help you.

- (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;
}
hustwcw

You shoud use : [self setRightViewMode:UITextFieldViewModeAlways];

Subclass UITextField and override -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];
   }
}
hustwcw
- (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;
        }
    }
}

Simple code for solve this problem

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

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

I have written an open source class, STAResizingTextField, that allows you to specify custom clear text field button images.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!