El siguiente código funciona en iOS6 (y antes), pero la UITextField no se muestra en iOS7…alguna idea sobre cómo obtener un UITextField para mostrar en un UIAlterView en iOS7?

UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:self];
[dialog setTitle:@"Enter ESC Score"];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
dialog.tag = 5;

nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setKeyboardType:UIKeyboardTypeNumberPad];
[nameField becomeFirstResponder];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 0.0);
[dialog setTransform: moveUp];
[dialog show];
[dialog release];

[nameField release];

Código de ejecución para iOS6 muestra esto:

No se puede agregar UITextField a UIAlertView en iOS7...funciona en iOS 6

mismo código en iOS7 muestra este (observe cómo UITextField falta y no hay un teclado):

No se puede agregar UITextField a UIAlertView en iOS7...funciona en iOS 6

  • el iOS7 aún es beta, ¿qué esperaba exactamente?
  • Bueno…supongo que si Apple va a lanzar iOS7 a mediados de septiembre, espero ser capaz de trabajar con un talentoso, brillante y afines de la comunidad de desarrolladores para que nuestras Aplicaciones no son inutilizables para miles de los actuales usuarios de Apple. Parece un poco tonto que Apple no espera a nadie para hablar acerca de cómo ser proactivo en mantener a sus usuarios felices. Así que vamos a pretender iOS7 no existe hasta que sea lanzado oficialmente? NDA son importantes, pero esto parece una tontería…y aún más absurda que alguien se está tomando el tiempo para ir a través de iOS7 preguntas y ding puntos de la gente. Acaba de decir…
  • Apple ofrece un foro para la discusión de iOS7 en el que embargado Api puede ser discutido. Los debates sobre aquí acerca de temas inéditos, y posiblemente no-software de trabajo no son muy útiles a los demás – a menos que específicamente etiquetados con los números de versión
  • mi 2ct: iOS es liberado y me encontré con este tema
  • increíble, tuve que instalar todo de nuevo osx para ios 7 también, increíble!
  • Supongo que lo que este problema de hecho su camino en el lanzamiento público de iOS 7 y nuestra aplicación se rompe en ese frente. Cualquier aplicación que ha utilizado esta técnica (no es raro, la verdad) está roto. Lo siento chicos, pero respondiendo a ese algo es «NDA, y no es útil a los demás» es el enfoque equivocado para mantener una fructífera de la comunidad que debería estar ayudando unos a otros con problemas del mundo real, que este uno es absolutamente. Beta o no, estos problemas existen – así que por favor ser constructivo sobre él en vez de ser desdeñosa y no agrega ningún valor a la pregunta.
  • Echa un vistazo a esta respuesta: stackoverflow.com/a/10689318/525576 voy con todas las formas posibles a partir de iOS 4 en conseguir este trabajo.
  • Trabajando como un encanto stackoverflow.com/a/25175852/2459296

InformationsquelleAutor iTrout | 2013-08-31

7 Comentarios

  1. 178

    No se puede alterar fácilmente el punto de vista de la jerarquía de un UIAlertView en iOS 7. (Ni se debe; la documentación que específicamente le dice que no.) Pásate por los foros de desarrolladores para ver una larga discusión sobre el mismo.

    Una de las alternativas que en su caso se establezca alert.alertViewStyle = UIAlertViewStylePlainTextInput; Esto agregará un campo de texto para usted. Usted puede acceder a ella en el UIAlertView delegado de devolución de llamada mediante UITextField *textField = [alertView textFieldAtIndex:0];.

    • Esto funciona bien para un solo campo de texto. En caso de que desee agregar dos campos de texto para uialertview entonces cuál es la solución?
    • Usted puede ser capaz de establecer [alertView textFieldAtIndex:1].secureTextEntry = NO si usted no desea ocultar de la segunda caja. Para algo más complejo que esto, hacer su propio punto de vista.
    • sentido 🙂
    • Pero va a ser aceptado por apple en la app de revisión?
    • Lo que cerca de 3 campos de texto? Usamos esto para la funcionalidad de restablecimiento de contraseña: «contraseña Actual, nueva contraseña, la nueva contraseña de nuevo».
    • No, usted tendrá que mirar en hacer su propio punto de vista o el uso de una 3ra parte de reemplazo. github.com/wimagguc/ios-custom-alertview y github.com/mindbrix/TSAlertView son las dos mejores que conozco para sus necesidades.

  2. 17

    @Aaron Brager tenía la solución correcta. Además he añadido una línea después de que su propuesta de forma predeterminada, un Teclado Numérico.

    UIAlertView* dialog = [[UIAlertView alloc] init];
    [dialog setDelegate:self];
    [dialog setTitle:@"Enter ESC Score"];
    [dialog setMessage:@" "];
    [dialog addButtonWithTitle:@"Cancel"];
    [dialog addButtonWithTitle:@"OK"];
    dialog.tag = 5;
    
    dialog.alertViewStyle = UIAlertViewStylePlainTextInput;
    [dialog textFieldAtIndex:0].keyboardType = UIKeyboardTypeNumberPad;
    
    CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 0.0);
    [dialog setTransform: moveUp];
    [dialog show];
    [dialog release];
    • Después de tanto @Aaron Brager la sugerencia Y la alteración de la forma en que la Alerta está configurado… como iTrout hizo el truco para mí! Gracias a los dos!!!
  3. 6
    UIAlertView *alertView = [[UIAlertView alloc]
                                      initWithTitle:@"Credit Card Number"
                                      message:@"Please enter your credit card number:"
                                      delegate:self
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"Ok", nil];
            [alertView setAlertViewStyle:UIAlertViewStylePlainTextInput];
            /* Display a numerical keypad for this text field */
            UITextField *textField = [alertView textFieldAtIndex:0];
            textField.keyboardType = UIKeyboardTypeNumberPad;
    
    [alertView show];
  4. 1

    Trabajando como un encanto

    Dos UITextField en UIAlertView para todas las versiones de iOS

    -(IBAction) showAlertView {
    UIAlertView *alert;  
    UITextField *callForwardNumber;
    UItextField *callForwardCondition;
    alert = [[UIAlertView alloc] initWithTitle:@"Enter Phone Number & Rule"
    message:@""
    delegate:self
    cancelButtonTitle:@"Cancel"
    otherButtonTitles:@"Save", nil];
    //alert.transform = CGAffineTransformMakeTranslation(0, 110);
    callForwardNumber = [[UITextField alloc] init];
    callForwardNumber.keyboardType = UIKeyboardTypeNumberPad;
    callForwardNumber.text = [R.prefs objectForKey:@"fwd_number"];
    callForwardNumber.borderStyle = UITextBorderStyleRoundedRect;
    callForwardNumber.delegate = self;
    callForwardNumber.tag = 1;
    callForwardCondition = [[UITextField alloc] init];
    callForwardCondition.text = callCondition;
    callForwardCondition.borderStyle = UITextBorderStyleRoundedRect;
    callForwardCondition.delegate = self;
    callForwardCondition.tag = 2;
    [callForwardCondition setKeyboardType:UIKeyboardTypeNumberPad];
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    UIView* customAccessory = 
    [[UIView alloc] initWithFrame:CGRectMake(0, 0, 250, 55)];
    callForwardNumber.frame = CGRectMake(0, 0, 245.0, 25.0);
    callForwardCondition.frame = CGRectMake(0, 30.0, 245.0, 25.0);
    [customAccessory addSubview:callForwardNumber];
    [customAccessory addSubview:callForwardCondition];
    [alert setValue:customAccessory forKey:@"accessoryView"];
    [alert show];
    } else {
    alert.message = @"\n\n\n";
    [alert show];
    callForwardNumber.frame = CGRectMake(20.0, 45.0, 245.0, 25.0);
    callForwardCondition.frame = CGRectMake(20.0, 75.0, 245.0, 25.0);
    [alert addSubview:callForwardNumber];
    [alert addSubview:callForwardCondition];
    }
    }
  5. 0

    1) En el método
    – (id)initWithAlertTitle:(NSString *)título checkForPassword:(NSString *)contraseña

    usted debe agregar

    self.alertViewStyle = UIAlertViewStylePlainTextInput;

    ejemplo:

    (id)initWithAlertTitle:(NSString *)title
    checkForPassword:(NSString *)password{
    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
    self.alertViewStyle = UIAlertViewStylePlainTextInput;
    }
    self = [super initWithTitle:title
    message:@"" //password field will go here
    delegate:self
    cancelButtonTitle:@"Cancel"
    otherButtonTitles:@"Enter", nil];
    if (self) {
    self.password = password;
    self.hashTechnique = HashTechniqueNone; //use no hashing by default
    secondMessage = @"Please Enter New Password";
    thirdMessage = @"Please Re-Enter Password";
    secondMessageNew = @"Please Enter Password";
    }
    NSLog(@" _password_ %@",_password);
    NSLog(@"_old_password_ %@",[[NSUserDefaults standardUserDefaults] objectForKey:kPassword]);
    return self;
    }

    en el método show
    añadir a continuación

    (void)show {
    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
    UITextField *passwordField = [self textFieldAtIndex:0];
    passwordField.delegate = self;
    self.passwordField = passwordField;
    }
    else
    {
    UITextField *passwordField = [[UITextField alloc] initWithFrame:CGRectMake(14, 45, 256, 25)];
    passwordField.secureTextEntry = YES;
    passwordField.placeholder = @"";
    passwordField.backgroundColor = [UIColor whiteColor];
    //Pad out the left side of the view to properly inset the text
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 6, 19)];
    passwordField.leftView = paddingView;
    passwordField.leftViewMode = UITextFieldViewModeAlways;
    //   //Set delegate
    self.passwordField.delegate = self;
    //Set as property
    self.passwordField = passwordField;
    //Add to subview
    [self addSubview:_passwordField];
    }
    //Show alert
    [super show];
    }

    también hacer cambios en el método haga clic en

    #pragma mark - UIAlertViewDelegate
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
    UITextField *passwordField = [self textFieldAtIndex:0];
    self.passwordField = passwordField;
    }
    if (buttonIndex == alertView.firstOtherButtonIndex) {
    if ([self enteredTextIsCorrect] || [self.title isEqualToString:secondMessage] || [self.title isEqualToString:secondMessageNew]) {
    if (([self.title isEqualToString:secondMessage] || [self.title isEqualToString:secondMessageNew]) && (self.passwordField.text.length > 0)) {
    self.password = self.passwordField.text;
    self.title = thirdMessage;
    self.passwordField.text = @"";
    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
    if ([self.passwordDelegate respondsToSelector:@selector(notifyParent::)]) {
    [self.passwordDelegate notifyParent:thirdMessage:self.password];
    }
    }
    }else
    {
    if ([self.title isEqualToString:thirdMessage]) {
    [[NSUserDefaults standardUserDefaults] setObject:self.password forKey:kPassword];
    [[NSUserDefaults standardUserDefaults] synchronize];
    if (self.passwordDelegate) {
    if ([self.passwordDelegate respondsToSelector:@selector(notifyParentWithState:)]) {
    [self.passwordDelegate notifyParentWithState:YES];
    }
    }
    }else{
    if ([self.title isEqualToString:secondMessageNew]) {
    self.title = secondMessageNew;
    }
    else{
    self.title = secondMessage;
    }
    self.passwordField.text = @"";
    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
    if ([self.passwordDelegate respondsToSelector:@selector(notifyParent::)]) {
    [self.passwordDelegate notifyParent:self.title:self.password];
    }
    }
    }
    }
    }
    //If incorrect then animate
    else {
    [self animateIncorrectPassword];
    }
    }
    }
    • Mi solución funciona en iOS 5 (solo lo utiliza en iOS 7 y superior). No hay necesidad de este trucos a menos que usted está apoyando el iOS 4. También, cualquiera que sea la aplicación que has copiado esto de que es el ahorro de una contraseña en NSUserDefaults, que es una idea terrible.
  6. 0

    También puede dar un vistazo a la costumbre de control en cocoacontrols.com. Eche un vistazo a MLAertView(ios 7 como interfaz de usuario) y TSAlertView(ios 6 como interfaz de usuario). Pueden ser transformados a un ángulo de rotación así.

  7. 0

    También soy de las que se enfrenta el mismo problema, Durante surf recibí la respuesta es el trabajo para mí. Espero que también funcione para usted.

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Folder Name?" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
    alertView.tag = 2;
    alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
    [alertView show];
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex    {
    UITextField * alertTextField = [alertView textFieldAtIndex:0];
    NSLog(@"alerttextfiled - %@",alertTextField.text);
    }

Dejar respuesta

Please enter your comment!
Please enter your name here