2012-04-09 8 views
13

Ich habe ein Implementierungsproblem mit einem Projekt mit MKStoreKit. Ich versuche ein UIAlertView mit verschiedenen Kaufoptionen zu implementieren. HieriOS Inkompatible Block Zeigertypen Problem

ist der Code, wo ich verschiedene Dinge tun und rufen 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 
    } 
} 

Dies ist die physikalische alertView mit dem Code, den ich zu nennen versuche:

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

Das Problem ist, Ich erhalte die folgende Xcode-Fehlermeldung im UIAlertView:

Inkompatible Blockzeigertypen 'int (^) (NSString *)' auf Parameter vom Typ 'void (^) (NSString *)'

Senden Es scheint, die Probleme sind: onComplete:^(NSString* purchasedFeature) und onCancelled:^ aber ich habe keine Ahnung, wie man das beheben kann.

Antwort

20

Sie sollten nicht return TRUE; von diesem Block, weil dann der Compiler davon ausgeht, dass Block einen int zurückgibt, während es void (daher inkompatible Blocktypen) zurückgeben sollte.

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

Für den zweiten Block (die onCancelled eins), verpassten Sie wahrscheinlich die NSString* Parameter, oder was auch immer sie erwartet.