110

मैं आपको आश्वासन देता हूं कि मैंने अपने प्रश्न के लिए SO में एक उत्तर की तलाश की लेकिन उनमें से कोई भी सहायक नहीं था। यहां तक ​​कि पहली बार मैं [UIPopoveController dealloc] पर पहुंच गया, जबकि ... त्रुटि और कार्यक्रम दुर्घटनाओं पाने सेUIPopovercontroller dealloc तब तक पहुंचा जब पॉपओवर अभी भी दिखाई दे रहा है

-(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]; 
} 

अब,: यहाँ मैं एक सरल कोड है कि एक UIImagePickerController एक UIPopoverController भीतर मौजूद होना चाहिए मिला है। मैं एआरसी के अनुसार किसी भी बनाए रखने, रिलायंस या ऑटोरेलीज़ नहीं कर रहा हूं। एआरसी से लाभान्वित होने पर 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 की तरह नहीं है? मेरे पास इसके लिए कभी भी ivar नहीं है, मैं बस इसे जहां भी चाहूं इसे आवंटित करता हूं, इसे दिखाता हूं और फिर [उपयोग किया जाता है] रिलीज़ करता हूं। Popovercontroller क्या अलग है? –

+17

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

+1

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

11

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

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

टिम

+0

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

10

जोड़ा जा रहा है क्या @ phix23 उत्तर दिया, बनाने * इस तरह POC संपत्ति:

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

और फिर बदल

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

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

का उपयोग नहीं करते हैं इसे अपनी। एच फाइल में डालने के लिए। इससे यह सार्वजनिक हो जाएगा और जब तक कि आप इसे नहीं चाहते हैं, बस इसे अपनी .m फ़ाइल में एक संपत्ति बनाएं। –

+0

मुझे आईओएस 7 में एक ही समस्या थी और मैंने इस समाधान को हल किया। – dobiho

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