No se puede ocultar la subvista personalizada.

He creado una subvista (que se parece mucho a una vista de alerta con spinner) para iOS 7 y aproveché la vista de alerta personalizada de iOS 7 de wimagguc (ios-custom-alertview en git). Usando ARC El problema que tengo es que muestro la vista mientras se está procesando, luego llamo para cerrar cuando se completa el procesamiento, pero todavía se muestra en la pantalla.

Connection.m (EDITAR)

UIActivityIndicatorView *aSpinnerCustom; CustomIOS7AlertView *alertViewCustom; - (void)showWaittingAlert:(BOOL)isShow { NSString *ver = [[UIDevice currentDevice] systemVersion]; float ver_float = [ver floatValue]; // custom alert view for iOS 7 from AlertViewCustom folder alertViewCustom = [[CustomIOS7AlertView alloc] init]; //spinner to be added to iOS 7 AlertView aSpinnerCustom = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; //label to be used as subview to help text and spinner alertTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 250, 75)]; //label of app name UILabel *subTitleApp; subTitleApp = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 250, 40)]; subTitleApp.text = APP_NAME; subTitleApp.font = [UIFont boldSystemFontOfSize:16.0f]; subTitleApp.textAlignment = UITextAlignmentCenter; subTitleApp.numberOfLines = 0; //label of processing UILabel *subTitle; subTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, 25, 250, 25)]; subTitle.text = @"processing..."; subTitle.font = [UIFont systemFontOfSize:14.0f]; subTitle.textAlignment = UITextAlignmentCenter; //set height of spinner in custom alertview aSpinnerCustom.frame = CGRectMake(round((alertTitle.frame.size.width - 25) / 2), round(alertTitle.frame.size.height - 30), 25, 25); aSpinnerCustom.tag = 1; // adding text and spinner to alertview [alertTitle addSubview:aSpinnerCustom]; [alertTitle addSubview:subTitleApp]; [alertTitle addSubview:subTitle]; //adding label to custom alertview [alertViewCustom setContainerView:alertTitle]; [alertViewCustom setButtonTitles:NULL]; if (isShow) { [alertViewCustom show]; [aSpinnerCustom startAnimating]; NSLog(@"%@",@"showWaitingAlert Show iOS 7"); }else { [alertViewCustom close]; [aSpinnerCustom stopAnimating]; NSLog(@"%@",@"showWaitingAlert Stop iOS 7"); } 

}

Es porque está utilizando la combinación incorrecta de variables de instancia y nombres de properties. Yo personalmente nunca uso los methods @synthesize generados @synthesize y recodificaría tu class así:

Archivo .h:

 @interface ConnectionManager : NSObject { UIActivityIndicatorView *_aSpinnerCustom; CustomIOS7AlertView *_alertViewCustom; } @property (nonatomic, retain) UIActivityIndicatorView *aSpinnerCustom; @property (nonatomic, retain) CustomIOS7AlertView *alertViewCustom; 

Archivo .m:

 // Be explicit @synthesize aSpinnerCustom = _aSpinnerCustom; @synthesize alertViewCustom = _alertViewCustom; 

y luego cambie todas las references a aSpinnerCustom y alertViewCustom a self.aSpinnerCustom y self.alertViewCustom . Nunca haga reference a las variables de instancia directamente en un entorno que no sea ARC.

Lo que está sucediendo con su código es que los methods @synthesize generados @synthesize han creado variables de respaldo que comienzan con _ , junto con las que creó y cuando usa alertViewCustom veces y self.alertViewCustom en otras ocasiones se están utilizando references incorrectas de objects.

Y no se olvide que su método dealloc debería usar self.whatever = nil; para liberar los objects.

Lo imaginé, mi subvista se creó cada vez que se llamaba el método. Incluí un if alertview == nil, por lo que no se creó dos veces. Gracias @trojanfoe por tu ayuda también.

  if (alertViewCustom == nil){ setup view code here.. }