2012-04-09 10 views
13

Ho un problema di implementazione con un progetto utilizzando MKStoreKit. Sto cercando di implementare un UIAlertView con varie opzioni di acquisto.iOS Tipo di puntatore a blocchi incompatibile problema

ecco il codice dove faccio varie cose e richiamare 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 
    } 
} 

Questa è la fisica alertView con il codice che sto cercando di chiamare:

- (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 questione è Ricevo il seguente messaggio di errore Xcode nello UIAlertView:

incompatibili tipi di puntatore blocco invio 'int (^) (NSString *)' al parametro di tipo 'vuoto (^) (NSString *)'

Sembra I problemi sono: onComplete:^(NSString* purchasedFeature) e onCancelled:^, ma non ho idea come risolvere questo problema.

risposta

20

Non si deve return TRUE; da quel blocco, perché il compilatore presuppone che il blocco restituisce un int, mentre deve restituire void (quindi tipi di blocco incompatibili).

...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. 
}... 

Per il secondo blocco (la onCancelled uno), probabilmente perso il parametro NSString*, o quello che si aspetta.

Problemi correlati