iOS不兼容的块指针类型问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
}
}
问题是我在UIAlertView
中收到以下Xcode错误消息:
不兼容的块指针类型将'int(^)(NSString *)'发送到'void(^)(NSString *)'类型的参数
看来问题是:onComplete:^(NSString* purchasedFeature)
和onCancelled:^
,但我不知道如何解决这个问题。
答案
你不应该从那个块中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*
参数,或者它预期的任何内容。
以上是关于iOS不兼容的块指针类型问题的主要内容,如果未能解决你的问题,请参考以下文章
不兼容的块指针类型将“int (^)(__strong id, __strong id)”发送到“NSComparator”类型的参数