2011-08-23 14 views
6

Trato de subclase UITextField la siguiente manera para poner en práctica RightView personalizado como un botón Borrar:UITextField RightView "WhileEditing" problema

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

pero el problema es: cuando el campo de texto sólo se convierte en el foco, "claro" -botón convierte también visible y después de que empiezo a tocar el teclado, desaparece. ¿Algunas ideas?

Respuesta

5

me encuentro con el mismo problema, también. Supongo que esto es un error de iOS, sin embargo, traté de solucionar este problema siguiendo las implementaciones y funciona bien para mí. Espero que esto te ayudará.

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

Usted shoud utiliza: [self setRightViewMode:UITextFieldViewModeAlways];

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

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

código simple para resolver este problema

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

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

He escrito una clase de código abierto, STAResizingTextField, que le permite especificar imágenes de los botones de campo de texto personalizado claras.