Получите немедленное значение от UIALertView - PullRequest
5 голосов
/ 12 октября 2011

У меня есть то, что наиболее точно можно описать как Factory, генерирующее некоторые операции NSO.Перед созданием NSOPerations я хотел бы проверить текущее состояние сети и, если пользователь подключен к сети 3G / Mobile, предупредить его, что он собирается выполнить операцию с большими объемами данных.

Я попыталсясделать это с помощью UIAlertView, но единственный способ получить «ответ» от UIAlertView - это система делегатов на основе событий.Мне было интересно, есть ли способ заставить его вести себя как диалог «подтвердить» в JavaScript, где он блокирует пользовательский интерфейс, и я могу получить немедленное значение из него после его отклонения.

Есть ли какой-либо стандарт?способ сделать это, или какой-то пример кода, на который я мог бы указать, который выполняет нечто подобное?

Ответы [ 3 ]

1 голос
/ 20 апреля 2012

Вы можете реализовать нечто похожее на это, используя блоки.Выполнение будет продолжено, как и во всех других случаях, но поток чтения вашего кода может больше походить на то, что вы хотите.Вот вспомогательный класс, который я сделал для этой цели, чтобы я мог просто пойти:

[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
1 голос
/ 14 октября 2011

Блокировка основного потока считается плохой практикой на iOS, и поэтому нет синхронного API для UIAlertView.

Необходимо реализовать обратный вызов делегата для предупреждения, которое ставит в очередь соответствующую операцию NSO. Может быть полезно создать подкласс UIAlertView для хранения соответствующих данных, необходимых для постановки в очередь NSOperation, или, что еще лучше, сохранить блок, который захватывает соответствующие переменные, а затем просто выполнить его, когда пользователь подтвердит диалог.

0 голосов
/ 28 сентября 2014

Используя код Рикки Хелгессона, я создал компонент 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
            ...
        }];

И добавить в подфайл:

pod "STAlertView"

На странице github есть дополнительные инструкции .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...