पॉप अप अभी भी दिखाई दे रहा है, जबकि UIPopovercontroller सौदा पर पहुँच गया


111

मैं आपको विश्वास दिलाता हूं कि मैंने अपने प्रश्न के लिए SO में उत्तर की तलाश की थी, लेकिन उनमें से कोई भी मददगार नहीं था। यहाँ मुझे एक सरल कोड मिला है जिसे एक के UIImagePickerControllerभीतर प्रस्तुत करना चाहिए UIPopoverController:

-(void)takePicture:(id)sender{
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=YES;
UIPopoverController *poc=[[UIPopoverController alloc] 
                            initWithContentViewController:picker];
[poc presentPopoverFromBarButtonItem:bbItem 
            permittedArrowDirections:UIPopoverArrowDirectionAny
                            animated:NO];
}

अब, यहां तक ​​कि पहली बार जब मैं [UIPopoveController dealloc]पहुंचता हूं, तब तक ... त्रुटि और प्रोग्राम क्रैश हो जाता है। मैं एआरसी के अनुसार कोई भी रिटेल, रिलेसे या ऑटोरेलिस नहीं कर रहा हूं। UIPopoverControllersएआरसी से लाभान्वित होने के साथ क्या कोई विशेष विचार है ?

जवाबों:


203

UIPopoverControllers को हमेशा एक उदाहरण चर में आयोजित किया जाना चाहिए। इसके लिए एक मजबूत संपत्ति बनाना एक अच्छा अभ्यास है।

अपडेट करें:

IOS 8 के रूप में आपको उपयोग करना चाहिए UIPopoverPresentationController। फिर आपको पॉपओवर का संदर्भ रखने की आवश्यकता नहीं है क्योंकि यह प्रस्तुति नियंत्रक द्वारा प्रबंधित किया जाता है।

कोड उदाहरण (iPhone और iPad दोनों पर काम करता है):

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
picker.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popoverPC = picker.popoverPresentationController;
popoverPC.barButtonItem = bbItem;
popoverPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:picker animated:YES completion:nil];

1
ओह मैं समझा। लेकिन यह एक UIAlertView की तरह नहीं है? मेरे पास कभी भी इसके लिए आईवर नहीं होता है, मैं जहां जरूरत होती है, वहां इसे आवंटित करता हूं, इसे दिखाता हूं और फिर [जारी] करता था। Popovercontroller में क्या अलग है?
मिकाईल अब्दुल्लायेव

17
@Mikayil सतर्क दृश्य इसके पर्यवेक्षक द्वारा बनाए रखा जाता है (जैसा कि सभी विचार हैं), लेकिन popoverController एक दृश्य नहीं है, इसलिए आपके पास पर्यवेक्षण नहीं है, इसलिए यदि आप इसे बनाए नहीं रखते हैं, तो कोई भी इसे बनाए नहीं रखेगा (या इसे एक मजबूत चर में संग्रहीत करें जिसमें एक गुंजाइश है जो वर्तमान विधि से अधिक है - उदाहरण के लिए एक iVar)।
fzwo

1
लेकिन मैं अभी भी UIPopoverController की गिनती के बारे में उलझन में हूं। क्योंकि मैं एक आवंटित करने और एक init से पहले एक जांच डाल दिया। और केवल अगर यह शून्य है तो मैं एक नया आवंटित करता हूं। लेकिन पहली बार इसे आवंटित करने के बाद मुझे यह कभी नहीं मिला। मेरा मतलब है कि मैं एक बार एक तरीका कहता हूं। वहां मैं अपने आइवर को आवंटित और इनिट करता हूं। और अगली बार जब मैं फिर से इस विधि को कहता हूं तो मुझे लगता है कि मेरा आइवर पहले से ही आवंटित है। अगर एआरसी इस बात का ध्यान रखती है, तो वह इसे कब जारी करती है। या यह इसे ऑटोरेलिज़ करता है?
मिकायाल अब्दुल्लायेव

@ माईकाइल आइवर एआरसी द्वारा जारी किए जाते हैं, जब वस्तु को हटा दिया जाता है या जब आप उन्हें शून्य पर सेट करते हैं
फेलिक्स

लेकिन उन्होंने प्रलेखन में इसका उल्लेख नहीं किया है, हाउ टू यू सेक्शन में वे स्थानीय चर का उपयोग करते हैं
अमित बट्टन

11

जब फ़ंक्शन बाहर निकलता है, तो पॉपओवर नियंत्रक का कोई अन्य संदर्भ नहीं होता है, इसलिए इसे बहुत जल्दी से डील किया जाता है।

इसके बजाय इसे अपनी कक्षा के सदस्य के रूप में जोड़ने का प्रयास करें।

टिम


क्या मुझे अभी भी पहले यह देखने में सक्षम नहीं होना चाहिए कि इससे पहले कि यह समाप्त हो जाए?
मिकायिल अब्दुल्लायेव

10

जोड़ने @ phix23 ने उत्तर दिया, इस तरह से * poc प्रॉपर्टी बनाएं:

@property (nonatomic, retain) IBOutlet UIPopoverController *poc;

और फिर बदलो

UIPopoverController *poc = [[UIPopoverController alloc] 
                            initWithContentViewController:picker];

के लिये

self.poc = [[UIPopoverController alloc] 
                            initWithContentViewController:picker];

11
आपको इसे अपनी .h फ़ाइल में नहीं रखना है। वह इसे सार्वजनिक कर देगा और जब तक आप नहीं चाहते, बस इसे अपनी .m फ़ाइल में एक संपत्ति बना लें।
जोशुआ नृत्य
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.