自定义UIAlertView没有委托回调?

时间:2012-08-05 20:48:37

标签: ios callback indexing custom-controls uialertview

我刚刚实施了:https://github.com/gpambrozio/BlockAlertsAnd-ActionSheets

我已将所有必要的文件导入我的应用程序并编译正常。现在的问题是,我该如何处理逻辑变化?

所以在使用Apple的UIAlertView之前我做过类似的事情:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Which Key?" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
            for (NSMutableDictionary *dict in myArray) {
                [alertView addButtonWithTitle:[dict objectForKey:@"Key"]];
            }
 [alertView show];
 [alertView release];

然后在alertview的回调中我会这样做:

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    [[Singleton sharedSingleton] setKey:buttonIndex];
}

现在BlockAlertView没有按下按钮的回调,他们按下按钮的方式是将你想要执行的代码放在块中,如下所示。无论如何,这就是类似BlockAlertView的外观:

BlockAlertView *alertView = [BlockAlertView alertWithTitle:@"Which Key?" message:nil];
            for (NSMutableDictionary *dict in myArray) {
                [alertView addButtonWithTitle:[dict objectForKey:@"Key"] block:^{
                    //Not sure what to do here
                }];
            }
[alertView show];

现在我不知道该怎么做,在那个块中我如何实现我之前使用Apple的原生UIAlertView所做的事情?我无法访问按钮索引,也无法访问按钮的名称(因为我需要索引,因此无论如何都不会对我的情况有所帮助)

无论如何,我应该如何继续使用Apple的原生UIAlertView,但使用BlockAlertView的逻辑呢?

谢谢!

Edit1 @Christian Pappenberger:

这是BlockAlertView的.h,我不认为我可以添加一个协议,除非我错了。这是:

@interface BlockAlertView : NSObject {
@protected
    UIView *_view;
    NSMutableArray *_blocks;
    CGFloat _height;
}

+ (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message;

- (id)initWithTitle:(NSString *)title message:(NSString *)message;

- (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block;
- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block;
- (void)addButtonWithTitle:(NSString *)title block:(void (^)())block;

- (void)show;
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated;

@property (nonatomic, retain) UIImage *backgroundImage;
@property (nonatomic, readonly) UIView *view;
@property (nonatomic, readwrite) BOOL vignetteBackground;

@end

2 个答案:

答案 0 :(得分:3)

阻止是触发后将执行的代码的一部分。

[alertView addButtonWithTitle:[dict objectForKey:@"Key"] block:^{
                    //Not sure what to do here
                }];

上面的代码为BlockAlertView添加了一个按钮,按下后,中的代码就会被执行。这是一个例子:

...

[alertView addButtonWithTitle:@"First Button" block:^{
                    NSLog(@"First Button Pressed");
                }];

[alertView addButtonWithTitle:@"Second Button" block:^{
                    NSLog(@"Second Button Pressed");
                }];
...

[alertView show];

执行代码并显示alertView后,alertView中将出现两个按钮,标题为“First Button”和“Second Button”。单击每个按钮时,将执行的是块中的代码将被执行。根据按下的按钮,控制台将输出“按下第一个按钮”或“按下第二个按钮”。

现在你知道这种类型的alertViews是如何工作的,我将解释你需要做什么。

当你指出你不会得到buttonIndex,但你会知道哪个按钮触发了阻止。

因此,如果您现在需要buttonIndex,我会添加int buttonIndex并每次增加它,如下面的代码所示:

BlockAlertView *alertView = [BlockAlertView alertWithTitle:@"Which Key?" message:nil];

    int buttonIndex = 0; // HERE

    for (NSMutableDictionary *dict in myArray) {
       [alertView addButtonWithTitle:[dict objectForKey:@"Key"] block:^{
                [[Singleton sharedSingleton] setKey:buttonIndex]; // HERE
           }];

    buttonIndex++; // HERE
                    }

        [alertView show];

如果您需要进一步解释其他内容,请随时提出。

编辑已添加说明

block范例与代表范式不同。按下按钮时使用delegate范例,它将调用clickedButtonAtIndex:案例中的委托方法(UIAlerViewDelegate)。执行块时,会触发每个单独的块。

这是关键:

使用阻止方法时,每个按钮都拥有一旦触发后就会执行的代码。在委托方法按下按钮时,它们将调用要执行的常用方法。

所以在一个例子中:

目标:根据按下的按钮向控制台输出不同的单词。

代表方法:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Which Key?" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil];

[alertView addButtonWithTitle:"@Button 1"];
[alertView addButtonWithTitle:"@Button 2"];
[alertView addButtonWithTitle:"@Button 3"];

[alertView show];

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(buttonIndex == 0)
       NSLog(@"Dog");
    else if (buttonIndex == 1)
       NSLog(@"Cat");
    else if (buttonIndex == 2)
       NSLog(@"Shark");
}

正如您所看到的,一旦按下该按钮,就会调用委托方法,并根据buttonIndex输出的内容决定何时输出。

阻止方法:

BlockAlertView *alertView = [BlockAlertView alertWithTitle:@"Which Key?" message:nil];

[alertView addButtonWithTitle:@"Button 1" block:^{
                    NSLog(@"Dog");
                }];
[alertView addButtonWithTitle:@"Button 2" block:^{
                    NSLog(@"Cat");
                }];          
[alertView addButtonWithTitle:@"Button 3" block:^{
                    NSLog(@"Shark");
                }];

[alertView show];

在这种情况下,不会调用任何委托方法,执行代码在每个按钮内!因此,您不需要“检查特定按钮标题字符串并根据该代码执行代码”。您需要包含将在每个按钮中执行的代码。

我不知道我是否清楚,如果你需要进一步解释,请随时提出。

答案 1 :(得分:0)

您是否检查过是否有协议实施者?