Подтвердить что ты не робот

IOS Несовместимые типы указателей блоков

У меня есть проблема с реализацией проекта с помощью 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:^, но я не знаю, как это исправить.

4b9b3361

Ответ 1

Вы не должны 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.
}...

Для второго блока (onCancelled один) вы, вероятно, пропустили параметр NSString* или что бы он ни ожидал.