2011-12-26 11 views
7

में UIAlertView का उपयोग करके मुझे अपने कस्टम NSObject क्लास में काम करने के लिए UIAlertView प्राप्त करने में एक भयानक समय है। शोध में मैंने ऐसा किया है ऐसा प्रतीत होता है कि यह संभव होना चाहिए, लेकिन यहां मैंने जो किया है।एक NSObject

सबसे पहले, यहाँ मेरी कोड है:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSLog(@"clickedButtonAtIndex: %d", buttonIndex); 
} 

-(void)testAlertView { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"List Contains Items" 
        message:@"List contains items. Remove all items & delete?" 
        delegate:self 
        cancelButtonTitle:@"No" 
        otherButtonTitles:@"Yes", nil]; 
    [alertView show]; 
} 

अगर मैं प्रतिनिधि स्वयं के लिए इस कोड के रूप में जल्द मैं एक बटन को टैप के रूप में दुर्घटनाओं की स्थापना की। अगर मैं इसे क्लिक करने के लिए सेट करता हूं तो बटन एट इंडेक्स को कभी नहीं कहा जाता है। मैंने <UIAlertViewDelegate> का उपयोग किए बिना और बिना प्रयास किए हैं।

मुझे पता है कि कोई पूछेगा कि 'आप अपने UIViewController के बजाय NSObject में ऐसा क्यों कर रहे हैं?'। मुख्य रूप से क्योंकि मैं इस कोड को अलग करना चाहता हूं ताकि मैं इसे अपने ऐप में कई स्थानों से उपयोग कर सकूं। लेकिन यह भी क्योंकि यह तर्क के एक बड़े ब्लॉक का एक छोटा सा टुकड़ा है जो स्वयं के लिए समझ में आता है।

कोई विचार क्या मैं गलत कर रहा हूं?

धन्यवाद, रिच

+0

इस कोड * चाहिए * काम करते हैं, वास्तव में। जब प्रतिनिधि सेट होता है और अलर्ट क्रैश हो जाता है, तो यह वास्तव में दुर्घटनाग्रस्त हो जाता है और क्या वहां एक स्टैक ट्रेस होता है? –

+1

क्या आपके ऑब्जेक्ट को बटन टैप करते समय हटा दिया गया है? (ऑब्जेक्ट आमतौर पर अपने प्रतिनिधियों को बरकरार नहीं रखते हैं) –

+0

यह सिर्फ सामान्य है। मैंने इस पर घूरने में घंटों बिताए और किसी भी सफलता के बिना एक चीज की खोज और कोशिश की, इसलिए मैंने मदद मांगी। एक घंटे बाद नहीं मैंने अंत में इसे समझ लिया। इसे कॉलिंग व्यू कंट्रोलर में कस्टम ऑब्जेक्ट बनाने के तरीके से करना था, इसलिए जब मैंने फ्रेडरिक सुझाव दिया था, तब तक इसे बटन टैप करने के दौरान रिलीज़ किया गया था। इनपुट के लिए शुक्रिया दोस्तों! – rdfrahm

उत्तर

8

मैं एआरसी का उपयोग कर एक ही समस्या थी। समस्या की जड़ एक जैसी थी। मैंने अपने कस्टम एनएसओब्जेक्ट को एक "मजबूत" संपत्ति में डालकर हल किया है ताकि यह सुनिश्चित किया जा सके कि ऑब्जेक्ट तब तक मौजूद है जब तक ऑब्जेक्ट कॉलिंग ऑब्जेक्ट (मेरे मामले में एक UIVIewCOntroller) मौजूद है, इसलिए जब मेरे अलर्ट व्यू के प्रतिनिधि को कॉल किया जाता है तो मुझे अभी भी मेरा रिवाज है ऑब्जेक्ट ऑब्जेक्ट और प्रतिनिधि विधि ठीक काम करती है।

+0

आप महोदय ने मुझे आज कुछ घंटों बचा लिया होगा! – ebi

1

मजबूत संपत्ति के रूप में NSObject जोड़ें:

#import "Logout.h" // is NSObject 
. 
. 
. 
@property (nonatomic, strong) Logout *logout; 

तो फिर तुम delegatemethods अपने NSObject में कहा जाता है मिल जाएगा।

@interface Logout() <UIAlertViewDelegate> 

और अपने विधि में:

UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"title" 
message:@"message" delegate:self cancelButtonTitle:@"cancel" 
otherButtonTitles:@"ok", nil];    

[a show]; 
0

कैसे UIAlertController उपयोग करते समय आप एक नहीं है एक चेतावनी दृश्य पेश करने के लिए

मत UIAlertView के लिए प्रतिनिधि रजिस्टर करने के लिए भूल जाते हैं नियंत्रक देखें। Detail description

हां, आप केवल UIViewController कक्षाओं में केवल UIAlertController का उपयोग कर सकते हैं। तो हम एनएसओब्जेक्ट कक्षाओं में इसे कैसे कर सकते हैं। यदि आप ऊपर दिए गए विवरण लिंक को देखते हैं तो आपको जवाब मिल जाएगा। उपर्युक्त विवरण के लिए एक पंक्ति में सारांशित करने के लिए: वर्तमान विंडो के ऊपर एक नई विंडो बनाएं। यह नई विंडो हमारा दृश्य नियंत्रक होगा जहां हम अलर्ट प्रदर्शित करेंगे। तो इस दृश्य का उपयोग कर नियंत्रक आप विधि [presentViewController: animated: completion:] पर कॉल कर सकते हैं।

उत्तर:

dispatch_async(dispatch_get_main_queue(), ^{ 

        UIWindow* window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

        window.rootViewController = [UIViewController new]; 
        window.windowLevel = UIWindowLevelAlert + 1; 
        NSString *[email protected]“Your mssg"; 
        UIAlertController* alertCtrl = [UIAlertController alertControllerWithTitle:@“Title" message:msg preferredStyle:UIAlertControllerStyleAlert]; 

        [alertCtrl addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Yes",@"Generic confirm") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { 

         // do your stuff 
         // very important to hide the window afterwards.      
         window.hidden = YES; 

        }]]; 

        UIAlertAction *cancelAction= [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 

         window.hidden = YES; 

        }]; 

        [alertCtrl addAction:cancelAction]; 

       //http://stackoverflow.com/questions/25260290/makekeywindow-vs-makekeyandvisible 

        [window makeKeyAndVisible]; //The makeKeyAndVisible message makes a window key, and moves it to be in front of any other windows on its level 
        [window.rootViewController presentViewController:alertCtrl animated:YES completion:nil]; 

       }); 
संबंधित मुद्दे