¿Cómo mover los botones en un UIAlertView para dejar espacio para un UITextField insertado?

StackOverflow https://stackoverflow.com/questions/409599

  •  03-07-2019
  •  | 
  •  

Pregunta

[EDITAR] Hmm. Quizás esta pregunta debería titularse "¿Cómo se llama la vista de diálogo de entrada de usuario predeterminada en CocoaTouch?" Me doy cuenta de que puedo crear una vista completa que es exactamente lo que quiero, y envolverla en un controlador de vista y presentModalView, pero tenía la esperanza de que hubiera un cuadro de diálogo estándar y normal de entrada de usuario " " Mira eso que vino con el toque de cacao. " Ingrese su nombre " ;, " ingrese texto para buscar " ;, etc., ¡son cosas MUY comunes!

De todos modos ... aquí está la pregunta tal como la formulé originalmente:

Este código:

UIAlertView* find = [[UIAlertView alloc] init];
[find setDelegate:self];
[find setTitle:@"Find"];

[find addButtonWithTitle:@"Cancel"];
[find addButtonWithTitle:@"Find & Bring"];
[find addButtonWithTitle:@"Find & Go"];
[find addButtonWithTitle:@"Go To Next"];

[find addSubview:_findText];

CGRect frm = find.frame;
int height = frm.size.height + _findText.frame.size.height + 100; // note how even 100 has no effect.
[find setFrame:CGRectMake(frm.origin.x, frm.origin.y, frm.size.width, height)];

[find setNeedsLayout];
[find show];
[find release];

Produce esta vista de alerta:

Find Alert http://www.publicplayground.com/IMGs/Misc/FindAlert .png

(Comencé con el código de esta pregunta de emi1Faber , y funciona como se anuncia, sin embargo, como indico en mi comentario, el botón de cancelación superpone el campo de texto.)

¿Cómo reorganizo todo para que el campo de texto se ajuste correctamente? [findAlert setNeedsLayout] no parece hacer nada, incluso después de que [findAlert setFrame: tallerFrame]. ¿Consejos?

¡Gracias!

¿Fue útil?

Solución

La forma más sencilla (y más adecuada) de mover la vista de texto hacia abajo es agregar un mensaje

[find setMessage:@"\n"];

Además, la razón por la que su marco no está teniendo efecto es que -show establece el marco y crea la jerarquía de vistas antes de comenzar la animación. También debe hacer que la vista de texto sea el primer respondedor para que aparezca el teclado.

Ejemplo completo:

// Create Alert
UIAlertView* av = [UIAlertView new];
av.title = @"Find";
// Add Buttons
[av addButtonWithTitle:@"Cancel"];
[av addButtonWithTitle:@"Find & Bring"];
[av addButtonWithTitle:@"Find & Go"];
[av addButtonWithTitle:@"Go to Next"];
// Make Space for Text View
av.message = @"\n";
// Have Alert View create its view heirarchy, set its frame and begin bounce animation
[av show];
// Adjust the frame
CGRect frame = av.frame;
frame.origin.y -= 100.0f;
av.frame = frame;
// Add Text Field
UITextField* text = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
text.borderStyle = UITextBorderStyleRoundedRect;
[av addSubview:text];
[text becomeFirstResponder];

Nota: también puede modificar las subvistas de UIAlertView, pero dado que Apple ya ha cambiado el diseño de UIAlertView, una vez que debe verificar sus descripciones de clase y marcos con los valores conocidos antes de establecer otros nuevos. Incluso puedes obtener algo como esto:

 Vista previa
(fuente: booleanmagic.com )

Otros consejos

Incluso si puedes hacer que esto funcione, no va a ser muy iPhone-y. El UIAlertView realmente no está diseñado para que el usuario lo ingrese de esta manera. Si observa todas las aplicaciones de Apple, verá que usan una nueva vista que se muestra con el método presentModalViewController: de UIViewController .

Editar : este consejo ya no es tan cierto como cuando lo escribí. Apple ha utilizado cada vez más las vistas de alerta como cuadros de entrada de texto e iOS5 incluso incluye soporte nativo sin tener que perder el tiempo con las vistas (consulte alertViewStyle (propiedad)).

Creo que si necesita tener cuatro botones, el uso de un UIViewController personalizado probablemente siga siendo el camino correcto. Pero si solo desea ingresar una contraseña con los botones Aceptar / Cancelar, entonces está bien.

Zoul propuso el mejor método, para capturar las opiniones de los usuarios, simplemente haga lo siguiente:

a) Agregue el protocolo UITextFieldDelegate a su clase.

b) Haz algo como

    UIAlertView *insertScore = [UIAlertView new];
    [insertScore setDelegate:self];
    [insertScore setTitle:@"New Title!"];
    [insertScore addButtonWithTitle:@"Cancel"];
    [insertScore addButtonWithTitle:@"Ok"];

    insertScore.message = @"\n";

    [insertScore addTextFieldWithValue:@"Input" label:@"player"];

    [[insertScore textField] setDelegate:self];

    [insertScore show]; 

    [insertScore release];

c) La parte crucial fue establecer el delegado de textField en self, luego, para acceder a los datos, simplemente puede:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{
  NSLog(@"%@",[[alertView textField] text]);
}

Espero que esto ayude a alguien, ya que tuve que pensar un poco para hacerlo bien.

Lo más probable es que desee consultar el método addTextFieldWithValue de UIAlertView ? Agregue el siguiente código en algún lugar en la parte superior de su clase:

@interface UIAlertView ()
- (void) addTextFieldWithValue: (NSString*) val label: (NSString*) label;
- (UITextField*) textField;
@end

No es oficial, pero en mi humilde opinión no te está rechazando en la tienda de aplicaciones y es una solución mucho mejor que hackear el campo de texto en el diálogo Tú mismo.

Explica cómo establecer el número de columnas, no lo he probado.

http://iloveco.de/uikit-alert-types/

  

Sin embargo hay un método privado,   setNumberOfRows: (int) n que permitirá   para establecer un número máximo de filas para   mostrar los botones en. Para utilizar este   Método que necesitamos para añadir nuestro propio   Adiciones a la clase UIAlertView. Nosotros   hacer esto agregando una interfaz para   UIAlertView en nuestro archivo .m.

// extend the UIAlertView class to remove the warning caused
// by calling setNumberOfRows.
@interface UIAlertView (extended)
- (void) setNumberOfRows:(int)num;
@end

Esto nos permitirá llamar al método sin que el compilador nos envíe una advertencia.

[myAlert setNumberOfRows:2];

Intente colocar algunos (\ n) s después del título en la inicialización de UIAlertView. Eso empujará hacia abajo los botones. Y estoy de acuerdo con Stephen aquí. Hay posibilidades de que Apple rechace una aplicación si utiliza los controles de una forma que no debería ser. (¡Hay alguna cláusula en las Directrices de interfaz humana sobre eso!)

Este método más simple funciona para mí:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView"
    message:@"<Alert message>" delegate:self cancelButtonTitle:@"OK"
    otherButtonTitles:nil];
[alert addTextFieldWithValue:@"" label:@"Text Field"];

Espero que ayude. Oh, si necesitas varias filas de botones, entonces es:

[alert setNumberOfRows:3];

Saludos

https://github.com/TomSwift/TSAlertView

Esta biblioteca realmente crea el control desde cero en lugar de intentar piratear UIAlertView, que generalmente es un Bad Plan (TM)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top