2011-09-13 18 views
11

Estoy agregando un botón claro personalizado (UIButton) a un UITextField como el RightView, sin embargo, he encontrado que hay un comportamiento extraño en el modo viewMode. No parece mostrarse como lo hace el botón de borrado normal, a pesar de que se está configurando el modo de visualización. código de ejemplo a continuación:UITextField rightViewMode comportamiento impar

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; 

El botón muestra correctamente en los siguientes estados:

  • Shows mientras enfocadas y sin texto
  • Shows, mientras que la concentración y escribir
  • Oculta cuando hay un enfoque

Sin embargo, si el campo de texto ya tiene contenido, y cambia el foco al mismo, el botón borrar no se cómo. Para que se muestre nuevamente, debe eliminar todo el texto y cambiar el foco hacia adelante y hacia atrás.

No he encontrado a nadie más con este problema, así que me he estado rascando la cabeza en este por un tiempo. Cualquier derramamiento de luz muy apreciado.

+0

Solo para aclarar el botón duerma aparece en absoluto? Tal vez intente reducir el tamaño de la imagen/tamaño del botón? Algunas cosas no han aparecido porque eran demasiado grandes. – Codr

+0

¿Has archivado un error en Apple? – user500

+0

no se olvidó de agregar la propiedad 'UITextFieldViewModeAlways'. –

Respuesta

8

Esto corrige el error:

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

En su subclase de UITextField con el _setupClearButtonMode var situado en init.

1

Recientemente me encontré con el mismo problema y terminé configurando el modo de vista derecha en UITextFieldViewModeAlways y mostrando u ocultando manualmente ese botón cuando era necesario (proxy delegado que monitoreaba el estado del campo de texto, establecía la visibilidad del botón y enviaba mensajes al delegado real) .

1

código simple para resolver este problema

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

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