2011-10-12 15 views
5

Mam to, co może być najdokładniej opisane jako Factory, które generuje pewne NSOperacje. Zanim wygenerowane zostaną NSOPeracje, chciałbym sprawdzić aktualny stan sieci i, jeśli użytkownik jest podłączony do sieci 3G/telefonii komórkowej, ostrzec ich, że zamierzają wykonać operację z dużą ilością danych.Uzyskaj natychmiastową wartość z UIALertView

Próbowałem to zrobić z UIAlertView, ale jedynym sposobem, w jaki widzę, aby uzyskać "odpowiedź" z UIAlertView jest za pośrednictwem opartego na zdarzeniach systemu delegatów. Zastanawiam się, czy istnieje sposób, aby działał jak dialog "potwierdzający" w JavaScript, gdzie blokuje interfejs użytkownika i mogę uzyskać natychmiastową wartość z niego, gdy zostanie odrzucony.

Czy istnieje jakiś standardowy sposób, aby to zrobić, lub jakiś przykładowy kod, na który można wskazać, który wykonuje coś podobnego?

+0

Nie jestem pewien, czy rozumiem twoje pytanie, UIAlertView blokuje również interfejs użytkownika i możesz natychmiast uzyskać odpowiedź z delegatem, co dokładnie chcesz osiągnąć? –

+0

Możesz podklasować UIAlertView i zwrócić wszystko, co chcesz. Pamiętam, że robił to selektor kolorów. –

+0

@Oscar: Problem polega na tym, że odpowiedź jest przechwytywana przez delegata i nie mam dostępu do wartości wewnątrz metody, która tworzy instancję UIAlertView, która jest tam, gdzie jest mi potrzebna. –

Odpowiedz

1

Zablokowanie głównego wątku jest uważane za złą praktykę na iOS, a zatem nie ma synchronicznego API dla UIAlertView.

Powinieneś zaimplementować oddzwanianie od uczestnika dla wpisu, który powoduje koleję z odpowiednią NSOperacją. Przydaje się podklasa UIAlertView do przechowywania odpowiednich danych potrzebnych do zakodowania NSOperation, lub jeszcze lepiej do przechowywania bloku, który przechwytuje odpowiednie zmienne, a następnie po prostu wykonaj, gdy użytkownik potwierdzi okno dialogowe.

1

Możesz zaimplementować coś podobnego do tego, używając bloków. Wykonanie będzie kontynuowane, jak we wszystkich innych przypadkach, ale przepływ czytania kodu może bardziej przypominać to, co chcesz. Oto klasy pomocnika, który zrobiłem w tym celu tak, że mogę po prostu iść:

[YUYesNoListener yesNoWithTitle:@"My Title" message:@"My Message" yesBlock:^ 
{ 
    NSLog(@"YES PRESSED!"); 
} 
noBlock:^ 
{ 
    NSLog(@"NO PRESSED!"); 
}]; 

... i tutaj jest klasa pomocnika:

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 
+0

Z kodem Twojej odpowiedzi Zbudowałem [komponent Pod] (https://github.com/nmaletm/STAlertView) używać go z łatwością. Wspomniałem twoje imię i odpowiedź SO, jeśli chcesz mi coś komentować, możesz swobodnie korzystać z mojej strony. Opublikuję również odpowiedź z kodem przy użyciu biblioteki. –

+0

Dzięki za odesłanie do mojej odpowiedzi Néstor. Komponent wygląda dobrze! –

0

Korzystanie kod Ricky Helgesson, ja Zbudowaliśmy komponent Pod w celu łatwego korzystania z tego rozwiązania w każdym projekcie wykorzystującym CocoaPods.

https://github.com/nmaletm/STAlertView

Kod, który należy użyć to:

[[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 
      ... 
     }]; 

I dodać na Podfile:

pod "STAlertView" 

Istnieją dalsze instrukcje na github page.