从UIALertView获得即时价值

时间:2011-10-12 14:05:41

标签: iphone ios ipad

我可以最准确地描述为Factory,它产生了一些NSOperations。在生成NSOPerations之前,我想检查当前的网络状态,如果用户在3G / Mobile连接上,则警告他们他们即将进行数据繁重的操作。

我尝试使用UIAlertView执行此操作,但我能看到从UIAlertView获取“响应”的唯一方法是通过基于事件的委托系统。我想知道是否有任何办法让它像JavaScript中的“确认”对话一样,它会阻止用户界面,一旦被解雇,我就可以从中获得直接价值。

有没有任何标准方法可以做到这一点,或者我可以指出的一些示例代码可以实现类似的东西?

3 个答案:

答案 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还有更多说明。