我可以最准确地描述为Factory
,它产生了一些NSOperations。在生成NSOPerations之前,我想检查当前的网络状态,如果用户在3G / Mobile连接上,则警告他们他们即将进行数据繁重的操作。
我尝试使用UIAlertView执行此操作,但我能看到从UIAlertView获取“响应”的唯一方法是通过基于事件的委托系统。我想知道是否有任何办法让它像JavaScript中的“确认”对话一样,它会阻止用户界面,一旦被解雇,我就可以从中获得直接价值。
有没有任何标准方法可以做到这一点,或者我可以指出的一些示例代码可以实现类似的东西?
答案 0 :(得分:1)
在iOS上阻止主线程被认为是不好的做法,因此UIAlertView没有同步API。
您应该为包含相关NSOperation的警报实现委托回调。将UIAlertView子类化以存储排队NSOperation所需的相关数据可能很有用,或者更好地存储捕获相关变量的块,然后在用户确认对话时执行该块。
答案 1 :(得分:1)
您可以使用块实现类似的功能。执行将像所有其他情况一样继续,但读取代码的流程可能更像您想要的。这是我为此目的制作的助手类,以便我可以去:
[YUYesNoListener yesNoWithTitle:@"My Title" message:@"My Message" yesBlock:^
{
NSLog(@"YES PRESSED!");
}
noBlock:^
{
NSLog(@"NO PRESSED!");
}];
......这里是助手类:
typedef void(^EmptyBlockType)();
@interface YUYesNoListener : NSObject <UIAlertViewDelegate>
@property (nonatomic, retain) EmptyBlockType yesBlock;
@property (nonatomic, retain) EmptyBlockType noBlock;
+ (void) yesNoWithTitle:(NSString*)title message:(NSString*)message yesBlock:(EmptyBlockType)yesBlock noBlock:(EmptyBlockType)noBlock;
@end
@implementation YUYesNoListener
@synthesize yesBlock = _yesBlock;
@synthesize noBlock = _noBlock;
- (id) initWithYesBlock:(EmptyBlockType)yesBlock noBlock:(EmptyBlockType)noBlock
{
self = [super init];
if (self)
{
self.yesBlock = [[yesBlock copy] autorelease];
self.noBlock = [[noBlock copy] autorelease];
}
return self;
}
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0 && self.noBlock)
self.noBlock();
else if (buttonIndex == 1 && self.yesBlock)
self.yesBlock();
[_yesBlock release];
[_noBlock release];
[alertView release];
[self release];
}
- (void) alertViewCancel:(UIAlertView *)alertView
{
if (self.noBlock)
self.noBlock();
[_yesBlock release];
[_noBlock release];
[alertView release];
[self release];
}
+ (void) yesNoWithTitle:(NSString*)title message:(NSString*)message yesBlock:(EmptyBlockType)yesBlock noBlock:(EmptyBlockType)noBlock
{
YUYesNoListener* yesNoListener = [[YUYesNoListener alloc] initWithYesBlock:yesBlock noBlock:noBlock];
[[[UIAlertView alloc] initWithTitle:title message:message delegate:yesNoListener cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil] show];
}
@end
答案 2 :(得分:0)
使用Ricky Helgesson的代码,我构建了一个Pod组件,可以在任何使用CocoaPods的项目中轻松使用此解决方案。
https://github.com/nmaletm/STAlertView
您应该使用的代码是:
[[STAlertView alloc] initWithTitle:@"Title of the alert"
message:@"Message you want to show"
cancelButtonTitle:@"No" otherButtonTitles:@"Yes"
cancelButtonBlock:^{
// Code todo when the user cancel
...
} otherButtonBlock:^{
// Code todo when the user accept
...
}];
并添加到Podfile:
pod "STAlertView"
github page还有更多说明。