14

MKStoreKitを使用するプロジェクトの実装に問題があります。UIAlertViewさまざまな購入オプションを実装しようとしています。

これは、さまざまなことを行って呼び出すコードです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
    }
}

alertViewこれは、私が呼び出そうとしているコードを含む物理的なものです:

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

問題は、次の Xcode エラー メッセージが に表示されることUIAlertViewです。

'int (^)(NSString *)' を 'void (^)(NSString *)' 型のパラメーターに送信する互換性のないブロック ポインター型

問題は次のように見えますが、onComplete:^(NSString* purchasedFeature)これonCancelled:^を修正する方法がわかりません。

4

1 に答える 1

22

return TRUE;コンパイラはブロックが を返すと想定するため、そのブロックからは使用しないintでくださいvoid(したがって、互換性のないブロック タイプ)。

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

2 番目のブロック ( onCancelled1 つ) については、おそらくNSString*パラメーターを見逃したか、それが期待するものは何でもありません。

于 2012-04-09T16:29:34.153 に答える