UITextField rightView “WhileEditing” problem

扶醉桌前 提交于 2019-12-19 03:01:08

问题


I try to subclass UITextField as follows to implement custom rightView as a Clear button:

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

but the Problem is: when the textfield just becomes focus, "clear"-button becomes visible too and after i begin to tap the keyboard it dissapears. Any ideas?


回答1:


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



回答2:


You shoud use : [self setRightViewMode:UITextFieldViewModeAlways];




回答3:


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];
   }
}



回答4:


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



回答5:


Simple code for solve this problem

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

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



回答6:


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



来源:https://stackoverflow.com/questions/7165642/uitextfield-rightview-whileediting-problem

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