2011-10-12 16 views
5

से तत्काल मूल्य प्राप्त करें मेरे पास Factory के रूप में सबसे सटीक रूप से वर्णित किया जा सकता है, जो कुछ NSOperations उत्पन्न कर रहा है। एनएसओपीरेशन उत्पन्न होने से पहले, मैं वर्तमान नेटवर्क स्थिति की जांच करना चाहता हूं और यदि उपयोगकर्ता 3 जी/मोबाइल कनेक्शन पर है, तो उन्हें चेतावनी दें कि वे डेटा-भारी ऑपरेशन करने जा रहे हैं।UIALertView

मैंने इसे UIAlertView के साथ करने का प्रयास किया, लेकिन यूआईएलर्टव्यूव से "प्रतिक्रिया" प्राप्त करने का एकमात्र तरीका ईवेंट-आधारित प्रतिनिधि प्रणाली के माध्यम से है। मैं सोच रहा था कि जावास्क्रिप्ट में "पुष्टि" संवाद की तरह कार्य करने का कोई तरीका था, जहां यह यूआई को अवरुद्ध करता है और इसे खारिज होने के बाद मुझे तत्काल मूल्य मिल सकता है।

क्या ऐसा करने का कोई मानक तरीका है, या कुछ उदाहरण कोड की ओर इशारा किया जा सकता है जो कुछ समान करता है?

+0

मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं, यूआईएलर्टव्यू यूआई को भी अवरुद्ध करता है, और आप तुरंत प्रतिनिधि के साथ प्रतिक्रिया प्राप्त कर सकते हैं, आप वास्तव में क्या करने की कोशिश कर रहे हैं? –

+0

आप UIAlertView को उपclass कर सकते हैं और अपनी इच्छानुसार कुछ भी वापस कर सकते हैं। मुझे यह एक रंग पिकर याद है। –

+0

@ ऑस्कर: समस्या यह है कि प्रतिनिधि प्रतिनिधि द्वारा प्रतिक्रिया प्राप्त की जाती है, और मेरे पास उस विधि के अंदर मूल्य तक पहुंच नहीं है जिसने UIAlertView को तुरंत चालू किया है, जहां मुझे इसकी आवश्यकता है। –

उत्तर

1

मुख्य धागे को अवरुद्ध करना आईओएस पर खराब अभ्यास माना जाता है, और इस प्रकार यूआईएलर्टव्यू के लिए कोई सिंक्रोनस एपीआई नहीं है।

आपको प्रासंगिक एनएसओपरेशन को प्राप्त करने वाले अलर्ट के लिए एक प्रतिनिधि कॉलबैक लागू करना चाहिए। NSOperation को एनक्यूएशन करने के लिए आवश्यक प्रासंगिक डेटा को संग्रहीत करने के लिए UIAlertView को उपclass करना उपयोगी हो सकता है, या फिर बेहतर ब्लॉक को कैप्चर करने वाले ब्लॉक को बेहतर स्टोर करना और फिर निष्पादित करना कि जब उपयोगकर्ता संवाद की पुष्टि करता है।

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

अवरुद्ध करना आपके उत्तर के कोड के साथ मैंने एक [पॉड घटक] बनाया है (https://github.com/nmaletm/STAlertView) इसे आसानी से उपयोग करने के लिए। मैंने आपका नाम और एसओ का जवाब बताया है, अगर आप मुझे टिप्पणी करना चाहते हैं तो मेरी वेबसाइट का उपयोग करने में संकोच न करें। मैं लाइब्रेरी का उपयोग कर कोड के साथ एक उत्तर भी पोस्ट करूंगा। –

+0

मेरे उत्तर नेस्टर का जिक्र करने के लिए धन्यवाद। घटक अच्छा लग रहा है! –

0

रिकी Helgesson के कोड का उपयोग करना, मैं यहाँ एक सहायक वर्ग है कि मैं उस उद्देश्य के लिए किया जाता है, ताकि मैं बस जा सकते हैं कोकोपोड्स का उपयोग करने वाली किसी भी परियोजना में आसानी से इस समाधान का उपयोग करने के लिए एक पॉड घटक बनाया है।

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 में और अधिक निर्देश हैं।

संबंधित मुद्दे