我刚刚实施了: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
答案 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)
您是否检查过是否有协议实施者?