2012-06-26 23 views

Respuesta

14

Puede crear una vista de accesorio de entrada que puede mostrar una UIToolBar sobre el teclado y luego agregarle un botón de cancelar. Eche un vistazo al enlace de documentación a continuación para la propiedad inputAccessoryView.

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextField_Class/Reference/UITextField.html

Este es un ejemplo de uno que hice para un TextView. El método Crear Vista de Accesorio se llama desde "textViewDidBeginEditing". Luego crea la vista de accesorios de entrada y en mi caso agrega tres botones y una barra espaciadora.

Espero que ayude.

-(void)textViewDidBeginEditing:(UITextView *)textView { 

[self createInputAccessoryView]; 
[textView setInputAccessoryView:_inputAccessoryView]; 
self.myTextView = textView; } 

-(void)createInputAccessoryView { 

_inputAccessoryView = [[UIToolbar alloc] init]; 
_inputAccessoryView.barStyle = UIBarStyleBlackOpaque; 
[_inputAccessoryView sizeToFit]; 

_inputAccessoryView.frame = CGRectMake(0,_collageView.frame.size.height - 44, _collageView.frame.size.width, 44); 

UIBarButtonItem *fontItem = [[UIBarButtonItem alloc] initWithTitle:@"Font" 
                  style:UIBarButtonItemStyleBordered 
                  target:self action:@selector(changeFont:)]; 
UIBarButtonItem *removeItem = [[UIBarButtonItem alloc] initWithTitle:@"Remove" 
                  style:UIBarButtonItemStyleBordered 
                  target:self action:@selector(removeTextView:)]; 
//Use this to put space in between your toolbox buttons 
UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
                      target:nil 
                      action:nil]; 
UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" 
                  style:UIBarButtonItemStyleDone 
                  target:self action:@selector(dismissKeyBoard:)]; 

NSArray *items = [NSArray arrayWithObjects:fontItem,removeItem,flexItem,doneItem, nil]; 
[_inputAccessoryView setItems:items animated:YES]; 
[_myTextView addSubview:_inputAccessoryView]; 
} 
+0

Gracias por esto, aunque si solo estuvieras haciendo un botón cancelar, ¿no pondría un cancel 'UIBarButtonItem' al lado del' UITextField' para lograr lo mismo sin una vista de accesorios? –

+0

Ahora que lo pienso, eso es exactamente lo que haría. Aunque esta es una muy buena respuesta y definitivamente resuelve mi problema, lo marcaré como aceptado entonces. –

+0

@kevinhorgan ¿por qué no asignó self.myTextView a la propiedad de entrada de inmediato? – Camus

0

Andrew, ¿cómo te va? ¡es Dima R!

Por lo que yo sé, no hay una gran manera de hacer lo que estás tratando de hacer. Se puede recoger fácilmente de uno de los construidos en los tipos enumerados here

typedef enum { 
    UIReturnKeyDefault, 
    UIReturnKeyGo, 
    UIReturnKeyGoogle, 
    UIReturnKeyJoin, 
    UIReturnKeyNext, 
    UIReturnKeyRoute, 
    UIReturnKeySearch, 
    UIReturnKeySend, 
    UIReturnKeyYahoo, 
    UIReturnKeyDone, 
    UIReturnKeyEmergencyCall, 
} UIReturnKeyType; 

Lo que podría hacer es o bien añadir una vista en la parte superior del teclado que contiene el botón de cancelación, o tratar de recorrer a través de la jerarquía de vistas y superponer lo que desea en el botón de esa manera (aunque este método no es confiable). Desafortunadamente, esto es algo que Apple aún no ha proporcionado mucha personalización.

edit: En realidad, creo que leí mal su pregunta desde el principio, ya que de todos modos no querría un botón cancelar como el botón de retorno principal. En este caso, la vista de accesorios de entrada es definitivamente el camino a seguir.

+1

Whoa qué retroceso, un placer verte aquí, amigo. Y gracias por la respuesta. Sí, me gustaría darle al usuario un botón de cancelación adicional, en caso de que quiera cancelar la entrada de texto. –

+1

La respuesta de Kevin Horgan es la que desea, es la forma correcta de lograrlo. – Dima

1

Acabo de caer una UIToolbar en mi controlador de vista en Interface Builder, entonces:

@property IBOutlet UIToolbar *keyboardAccessory; 

-(void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // this is so I can edit it in Interface Builder, but it doesn't show in the view 
    [keyboardAccessory removeFromSuperview]; 
} 

-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField { 
    textField.inputAccessoryView = keyboardAccessory; 
    return YES; 
} 

-(IBAction) pressedCancelButton { 
    [self.view endEditing:YES]; 
} 

Voila!

Cuestiones relacionadas