Puse un UITextField en un UIAlertView y se movió para que el teclado no cubrir con el siguiente código:

[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
UITextField * nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];

También tengo el siguiente código para lidiar con la vista de alerta:

- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex{    
    NSLog(@"%d", (int) buttonIndex);
    if (buttonIndex == 1) { //OK pushed
        NSLog([alert textField].text); //does not log anything
    } else {
        //Cancel pushed
}}

También tengo un UIAlertViewExtended.h archivo que contiene:

@class UITextField, UILabel;

@interface UIAlertView(Extended)

-(UITextField *)textField;

@end

Mi pregunta es ¿cómo puedo conseguir el texto que escribió el usuario y cómo puedo descartar el teclado?

Gracias,
Ben

  • el iPhone OS 4.0 parece hacer la transformación cosas automáticamente, probablemente tendremos que introducir un cheque si su base de SDK es 4.0 y el mínimo SDK que es de 3.0 por lo que el CGAffineTransform código sólo se ejecuta si el nativo de OS es de 3.0 o 3.1, para el iPhone OS 4.0 omita esta parte de código!
InformationsquelleAutor user21293 | 2008-12-17

10 Comentarios

  1. 49

    A cualquier persona que apoye el iOS 5.0 en adelante con ARCO, hay una directa alertViewStyle propiedad que se puede establecer:

    -(void)showAlertWithTextField{
        UIAlertView* dialog = [[UIAlertView alloc] initWithTitle:@"Enter Name" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];    
        [dialog setAlertViewStyle:UIAlertViewStylePlainTextInput];
    
        //Change keyboard type
        [[dialog textFieldAtIndex:0] setKeyboardType:UIKeyboardTypeNumberPad];
        [dialog show];
    }
    
    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
        if (buttonIndex == 1)
            NSLog(@"%@",[[alertView textFieldAtIndex:0]text]);
    }
    • acerca de la hora de conseguir una manera de hacer esto que no implica cortar el estúpido alertView. +1
    • Muy cierto!! Hizo una petición en bugreports?
  2. 31

    Para aquellos que cuidado, aquí es una solución de trabajo:

    UIAlertView* dialog = [[UIAlertView alloc] init];
    [dialog setDelegate:self];
    [dialog setTitle:@"Enter Name"];
    [dialog setMessage:@" "];
    [dialog addButtonWithTitle:@"Cancel"];
    [dialog addButtonWithTitle:@"OK"];
    
    nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
    [nameField setBackgroundColor:[UIColor whiteColor]];
    [dialog addSubview:nameField];
    CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
    [dialog setTransform: moveUp];
    [dialog show];
    [dialog release];
    [nameField release];

    Asegúrese de que ha creado UITextField * nameField; en su .h archivo, entonces usted puede conseguir en el texto que el usuario escribió en haciendo:
    inputText = [nameField texto];

    en el – (void) alertView:(UIAlertView *)alerta clickedButtonAtIndex:(NSInteger)buttonIndex método.

    nota importante: para iOS 4.0+, el CGAffineTransform se realiza de forma automática, así que puede dejar poco si sólo estás de orientación 4.0+. De lo contrario, usted tendrá que comprobar que su sistema operativo, y manejar en consecuencia.

    • Ok, que funciona bastante bien, pero ¿cómo puedo obtener los botones para desplazarse hacia abajo para hacer espacio para el campo de texto? En mi aplicación (que empieza como un copiar/pegar de la suya), tengo 4 botones (Cancelar, foo, bar, baz), y el campo de texto se superpone el botón cancelar.
    • Hey! ¿Por qué estás reteniendo la variable dialog? ¿No es ya asignados por usted? Yo podría estar equivocado, pero parece que le sale un objeto de esta manera. La regla de oro es que si usted asignación de un objeto, a continuación, usted debe liberar porque ya tiene una retener a cuenta de 1.
    • por el bien de la posteridad, he quitado el de conservar lo que llevó a una pérdida de memoria.
    • En iOS 4.2 de este modo se creará un alertview en la parte superior.También la eliminación de la CGAffineTransform no resolver el problema.¿Alguien tiene alguna solución?
    • asegúrese de que su setMessage es «» y «no». A mí me funcionó en 4.3
    • Muy bueno de verdad! Funciona muy bien en iOS 5.2.

  3. 14

    Es digno de la comprobación hacia fuera

    http://junecloud.com/journal/code/displaying-a-password-or-text-entry-prompt-on-the-iphone.html?cmd=success#comment3870

    Para una completa y exhaustiva de la solución.

    • El código en la dirección URL es limpio, fácil de usar.
    • Gran código. Recomiendo guardar el campo de texto en una variable de instancia. Entonces, usted no necesita implementar el campo de texto delegado y usted puede tener la dimisión de primera respuesta en alertView:willDismissWithButtonIndex: para deshacerse de la «wait_fences: no se pudo recibir respuesta: 10004003» los mensajes de la consola.
    • Roto bajo simulador 4.3. Se bloquea la aplicación.
  4. 6

    Una forma sencilla de localizar el campo de texto, sin tener una referencia explícita a ella, es establecer su etiqueta:

    nameField.tag = ALERTVIEW_NAMEFIELD;

    Asegúrese de que es distinto de 0 y de otros UIView objeto de etiquetas que usted pueda tener, incluyendo el padre de diálogo!

    A continuación, en el interior de la alertView:clickedButtonAtIndex: controlador, puede recuperar el campo de texto de esta manera:

    UITextField *nameField = (UITextField *)[alertView viewWithTag:ALERTVIEW_NAMEFIELD];
    • Limpio, aprender algo nuevo todos los días..
  5. 1

    Un muy buen enfoque, puede utilizar los métodos de delegado de la UITextFieldDelegate para mover el cuadro de diálogo sólo cuando el teclado está activado. Ver a continuación.

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5]; 
        [UIView setAnimationDelegate:self];
    
        CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, -20);
        [dialog setTransform: moveUp];
    
        [UIView commitAnimations];
    }
    
    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5]; 
        [UIView setAnimationDelegate:self];
    
        CGAffineTransform moveDown = CGAffineTransformMakeTranslation(0.0, 0.0);
        [dialog setTransform: moveDown];
    
        [textField resignFirstResponder];
    
        return YES;
    }
  6. 1

    Esto es para iOS5 y el ARCO.

    -(void)showAlert {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"New Album" 
            message:@"Enter a name for the album." 
            delegate:self 
            cancelButtonTitle:@"Cancel" 
            otherButtonTitles:@"Save", nil];
        alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
    
        UITextField* textfield = [alertView textFieldAtIndex:0];
        textfield.placeholder = @"Title";
    
        [alertView show];
    }
    
    -(void)alertView:(UIAlertView *)alertView 
        didDismissWithButtonIndex:(NSInteger)buttonIndex 
    {
        if (buttonIndex != 1) {
            NSLog(@"Cancel");
            return;
        }
        UITextField* textfield = [alertView textFieldAtIndex:0];
        NSLog(@"Save. text: %@", textfield.text);
    }
  7. 0

    Esto es en realidad sólo 1 línea más regular de la UIAlertView código. Espero que esto ayude!

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:@"This is a alert with a textfield" delegate:self cancelButtonTitle:@"YAY" otherButtonTitles:nil];
        alert.alertViewStyle = UIAlertViewStylePlainTextInput;
        [alert show];
        [alert release];

    sólo se ejecuta en iOS 5 o posterior

  8. 0

    Gustaría añadir un pequeño ajuste a iWasRobbed la respuesta:

    GenericAlertDialogs.m:

    + (void)displayInputDialog:(NSString*)title delegate:(id<UIAlertViewDelegate>)delegate textFiled:(UITextField*)txtField
    {
        UIAlertView* dialog = [[UIAlertView alloc] init];
        [dialog setDelegate:delegate];
        [dialog setTitle:title];
        [dialog setMessage:@" "];
        [dialog addButtonWithTitle:@"Cancel"];
        [dialog addButtonWithTitle:@"OK"];
    
        if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        {
            txtField.frame = CGRectMake(20.0, 45.0, 245.0, 25.0);
        }
        else 
        {
            txtField.frame = CGRectMake(20.0, 30.0, 245.0, 25.0);
        }
    
        [txtField becomeFirstResponder];
        [txtField setBackgroundColor:[UIColor whiteColor]];
        [dialog addSubview:txtField];
        [dialog show];   
    }

    Algunos otros .m archivo (implementa UIAlertViewDelegate)

     self->txtChangeName = [[UITextField alloc] init];
     [GenericAlertDialogs displayInputDialog:@"Some title...:" 
                                    delegate:self 
                                   textFiled:txtChangeName];

    La UIAlertViewDelegate protocolo de manejo:

    - (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex 
    {
        if(buttonIndex == 1)
        {
            if([txtChangeName.text length] > 0)
            {
                self->userInput = [txtChangeName text];
             }
         }
         self->txtChangeName = nil;
    }

    iOS 4+ cumple.

Dejar respuesta

Please enter your comment!
Please enter your name here