2012-04-09 10 views
13

Tengo un problema de implementación con un proyecto que usa MKStoreKit. Estoy tratando de implementar un UIAlertView con varias opciones de compra.iOS Tipos de punteros de bloque incompatibles problema

Este es el código donde hago varias cosas y acceder 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 
    } 
} 

Este es el alertView físico con el código que estoy tratando de llamar:

- (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 sharedManager] 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; 
     } 
    } 
} 

La cuestión es Recibo el siguiente mensaje de error de Xcode en el UIAlertView:

tipos de puntero de bloque incompatibles enviar 'int (^) (NSString *)' a parámetro de tipo 'vacío (^) (NSString *)'

Parece que los problemas son: onComplete:^(NSString* purchasedFeature) y onCancelled:^ pero no tengo ni idea Cómo arreglar esto.

Respuesta

20

No deberías return TRUE; de ese bloque, porque entonces el compilador asume que devuelve un bloque de int, mientras que debería volver void (por lo tanto los tipos de bloques 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 onCancelled uno), es probable que se perdió el parámetro NSString*, o lo que espera.

Cuestiones relacionadas