¿Cómo agregar una subvista dentro de UIAlertView para iOS 7?

Tengo una aplicación en la tienda de iTunes que muestra algunos UILabel y UIWebView en UIAlertView . Según el video de la sesión, addSubView para UIAlertView no funcionará. Han hablado sobre ContentView . Pero en el SDK de GM Seeds, no pude encontrar esa propiedad y parece que no hay otra manera.

Lo único que puedo hacer es crear una subclase personalizada de UIView y hacer que funcione como UIAertView . ¿Puedes sugerir alguna otra solución simple?

Gracias por la ayuda.

Realmente puede cambiar accessoryView a customContentView en iOS7 (y parece que en iOS8 también) UIAlertView

 [alertView setValue:customContentView forKey:@"accessoryView"]; 

Prueba este código:

 UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"TEST" message:@"subview" delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil]; UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 40)]; [av setValue:v forKey:@"accessoryView"]; v.backgroundColor = [UIColor yellowColor]; [av show]; 

Recuerde que debe configurar el accesorio accessView personalizado antes de la llamada [alertView show]

enter image description here

AddSubview no es posible desde iOS 7.

La única forma es crear una subclase UIView personalizada que pueda actuar como UIAlertView. Pude descubrir algunos componentes en Github.

La alerta personalizada enlazada parece funcionar bien. Al colocar la verificación de versión adecuada, se puede identificar para ir a UIAlertView nativo o CustomAlertView.

Agregar una subvista a un UIAlertView es diferente en iOS7 de las versiones anteriores de iOS. Pruebe algo como esto:

 if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { [myAlertView setValue:myCustomView forKey:@"accessoryView"]; //works only in iOS7 } else { myAlertView.message = @"\n"; //or just add \n to the end of the message (it's a workaround to create space inside the alert view [myAlertView addSubview:myCustomView]; } [myAlertView show]; //show the alert AFTER CUSTOMIZATION 

Piensa que recibirás ayuda también si la usas 🙂

 syncProgressBarView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault]; syncProgressBarView.frame =CGRectMake(20, 55, 250, 20); [syncProgressBarView setProgress:0.0f animated:NO]; syncProgressBarView.backgroundColor =[UIColor clearColor]; [progressView addSubview:syncProgressBarView]; 

Hacer una nueva vista para sub-visualizar UIProgressView

 progressView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, DeviceWidth, 100)]; [[UIApplication sharedApplication].keyWindow addSubview:progressView]; progressView.backgroundColor = [UIColor clearColor]; progressView.center = [UIApplication sharedApplication].keyWindow.center; syncProgressBarView.frame = CGRectMake(progressView.frame.size.width/2 - 250/2, progressView.frame.size.height/2 - 10, 250, 20); [[UIApplication sharedApplication].keyWindow bringSubviewToFront:[progressView superview]]; 

Una cosa más que tienes que hacer …

 dispatch_async(dispatch_get_main_queue(), ^{ [self updateProgressBar]; }); 

La vista de alerta personalizada en github vinculada en la respuesta aceptada es excelente. Sin embargo, no puede iniciar esto directamente desde el método viewdidload. El UIView adjunto se adjunta a la primera ventana de la aplicación, por lo que debe esperar una fracción de segundo. Agregué este código a viewdidload que encontré como un problema cerrado.

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ // Open the dialog here }); 

Una solución es subclase UIAlertView y detectar la vista “_UIModalItemAlertContentView”. Mi AlertView tenía un UITextField, así que lo usé para detectar la vista de contenido:

 - (void)show { [ super show ]; UIView *contentView=nil; if([[[UIDevice currentDevice] systemVersion] floatValue ] < 7.0f) { contentView=self; } else { UIView *rootView=[self textFieldAtIndex:0]; while((rootView=[rootView superview])!=nil) { if([ NSStringFromClass([rootView class]) isEqualToString:@"_UIModalItemAlertContentView"]) { contentView=rootView; break; } } } if(contentView!=nil) { [ contentView addSubview: ... ]; } }