如何将块参数传递给采用块的方法

时间:2013-01-07 21:42:13

标签: objective-c objective-c-blocks

我想声明一个方法,该方法将一个块作为参数,以便在解除警报时执行,因此具有如下内容。 但无法点击将block参数传递给onDismiss部分的语法:

- (void) notifyUserOfProblemWithDismissBlock: ( (^)()) block
{
    [UIAlertView showAlertViewWithTitle: @"whatever"
                            message: nil
                  cancelButtonTitle: nil
                  otherButtonTitles:[NSArray arrayWithObject:     NSLocalizedString(@"BUTTON_OK", nil)]
                          onDismiss:^(int buttonIndex){
                              block;
                          }
                           onCancel:^ {}];
}

2 个答案:

答案 0 :(得分:1)

如果您正在传递兼容的块类型,那么只需使用其参数名称:

...
onDismiss:theBlock
...

否则(这是你加入的情况),将其包装到另一个块中,在该块中调用最初作为参数传入的块:

...
onDismiss:^(int btnIdx) {
    theBlock();
}
...

此外,如果您不打算在某个区块中执行任何操作,例如onCancel:,则可以在nilNULL处传递。

答案 1 :(得分:1)

要将名为'block'的块直接传递给UIAlertView方法,它需要具有与该方法对其解雇块所期望的相同的签名(相同的返回类型,numuber和方法类型)。因为它没有,你可以传递一个具有正确签名的块,然后在那个块的主体中​​,调用你的块。你快到了。您缺少的关键是调用块的语法是:

块();

所以,这样做

- (void) notifyUserOfProblemWithDismissBlock:(void(^)(void)) block
{
    [UIAlertView showAlertViewWithTitle:@"whatever"
                                message:nil
                      cancelButtonTitle:nil
                      otherButtonTitles:@[NSLocalizedString(@"BUTTON_OK", @"BUTTON_OK")]
                              onDismiss:^(int buttonIndex) {
                                  block();
                              }
                               onCancel:^{}];
}