Problema de tipo de puntero de bloque incompatible de iOS

Esta es mi primera publicación en SO, así que veo fácil. Todos los derechos reservados

Tengo un problema de implementación con un proyecto que utiliza MKStoreKit . Estoy intentando implementar un UIAlertView with varias opciones de compra.

Aquí está el código donde hago varias cosas y llamo a UIAlertView:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if(FALSE == payWallFlag) { // Display Alert Dialog UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Subscription Options" message:@"You do not have an active subscription. Please purchase one of the options below." delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [message addButtonWithTitle:@"7 Day Subscription $0.99"]; [message show]; return FALSE; } else if(TRUE == payWallFlag) { // Load content } } 

Y esta es la vista de alerta física con el código que estoy intentando ejecutar:

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; if([title isEqualToString:@"Cancel"]) { NSLog(@"Cancel Button was selected."); } else if([title isEqualToString:@"7 Day Subscription $0.99"]) { NSLog(@"7 Day Subscription button pressed."); //Buy a 7 day subscription if([SKPaymentQueue canMakePayments]) { [[MKStoreManager shanetworkingManager] buyFeature:kFeatureAId onComplete:^(NSString* purchasedFeature) { NSLog(@"Purchased: %@", purchasedFeature); // Send an alert to the user UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Purchase Successful" message:@"Thank you. You have successfully purchased a 7 Day Subscription." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert autorelease]; [alert show]; // Show the user the content now payWallFlag = TRUE; return TRUE; } onCancelled:^ { // Send an alert to the user UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Purchase Failed" message:@"Unfortunately you have cancelled your purchase of a 7 Day Subscription. Please try again." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert autorelease]; [alert show]; // Block the content again payWallFlag = FALSE; }]; } else { NSLog(@"Parental control enabled"); // Send an alert to the user UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Purchase Failed" message:@"Unfortunately Parental Controls are preventing you from purchasing a subscription. Please try again." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert autorelease]; [alert show]; // Block the content again payWallFlag = FALSE; } } } 

El problema es que obtengo el siguiente post de error de Xcode en UIAlertView:

Tipos de puntero de bloque incompatibles que envían 'int (^) (NSString *)' al parámetro del tipo 'void (^) (NSString *)'

Aquí hay una captura de pantalla de dónde está sucediendo el error.

Parece que los problemas son: onComplete:^(NSString* purchasedFeature) y onCancelled:^ . Pero no tengo idea de cómo solucionar esto. Por favor ayuda.

No debes return TRUE; desde ese bloque, porque entonces el comstackdor asume que el bloque devuelve un int , mientras que debería devolver el void (por lo tanto, types de bloque incompatibles).

 ...onComplete:^(NSString* purchasedFeature) { NSLog(@"Purchased: %@", purchasedFeature); // Send an alert to the user UIAlertView *alert = [[UIAlertView alloc] ...]; [alert autorelease]; [alert show]; // Show the user the content now payWallFlag = TRUE; return TRUE; // <--- Remove this line. }... 

Para el segundo bloque (el que está onCancelled ), es probable que hayas perdido el parámetro NSString* , o lo que sea que espere.