2010-04-13 16 views
8

को खारिज करना मेरे पास एक UIPopoverController की सामग्री के अंदर एक बटन है। यह बटन myAction नामक एक विधि चलाता है।आईपैड - एक UIPopoverController

MyAction रूप

- (void) myAction:(id)sender 

हां, तो myAction फोन करने वाले बटन की आईडी प्राप्त करता है।

अब, इस विधि के अंदर मैं UIPopoverController को खारिज करना चाहता हूं, लेकिन मेरे पास केवल एक ही चीज़ है जो कॉलर बटन की आईडी है। याद रखें कि बटन UIPopoverController के अंदर है।

क्या यूआईपीओवर कंट्रोलर की आईडी को खोजने का कोई तरीका है, मेरे पास पहले से मौजूद बटन आईडी है?

धन्यवाद।

उत्तर

19

दुर्भाग्य से नहीं। कम से कम, मानक प्रथाओं के भीतर नहीं। आप इसे खोजने के लिए उत्तरदाता स्टैक की यात्रा करने में सक्षम हो सकते हैं, लेकिन यह एक हैक है, यह छोटी है, और यह वास्तव में, वास्तव में गन्दा है।

यदि आप एक बटन दबाकर एक पॉपओवर को खारिज करना चाहते हैं, तो कुछ जगह प्रासंगिक को पॉपओवर का संदर्भ रखना चाहिए। आमतौर पर पॉपओवर का मालिक होगा ( नियंत्रक पॉपओवर के भीतर दिखाया गया था)। जब बटन दबाया जाता है, तो यह मालिक नियंत्रक को एक संदेश भेज सकता है, जो तब पॉपओवर को खारिज कर सकता है।

आप पॉपओवर के अंदर प्रदर्शित नियंत्रक को अपने स्वयं के पॉपओवर के मालिक होने का लुत्फ उठा सकते हैं, लेकिन इस तरह कोडिंग भंगुर है, गन्दा हो सकता है (फिर से), और परिणामस्वरूप लूप बनाए रख सकते हैं ताकि न तो कभी न हो का विमोचन किया।

+0

धन्यवाद। मैं कोड बदल दूंगा! – SpaceDog

+3

दूसरा अनुच्छेद इस उत्तर में अत्यंत महत्वपूर्ण है। याद रखें, आईपैड प्रोग्रामिंग गाइड के मुताबिक: "जागरूक रहें, हालांकि, पॉपओवर नियंत्रक के संदर्भ को स्टोर करना आपकी ज़िम्मेदारी है ताकि आप इसे खारिज कर सकें। सिस्टम डिफ़ॉल्ट रूप से एक प्रदान नहीं करता है।" इसलिए, जब तक पैरेंट व्यू डेलोक चरण में प्रवेश नहीं कर लेता है, तब तक "रिलीज़]" न करें (वैसे भी दुर्घटना हो जाएगी)। (वह मेरी सुरक्षा विधि है)। – Jann

+0

बस [self dismissViewControllerAnimated: YES समापन: शून्य] का उपयोग करें; "प्रेजेंटिंग व्यू कंट्रोलर प्रस्तुत दृश्य नियंत्रक को खारिज करने के लिए ज़िम्मेदार है। अगर आप इस विधि को प्रस्तुत दृश्य नियंत्रक पर ही कॉल करते हैं, तो यह स्वचालित रूप से प्रस्तुत करने वाले दृश्य नियंत्रक को संदेश अग्रेषित करता है।" –

4

मेरे पास यह काम है, और मुझे नहीं लगता कि यह एक हैक है। मेरे पास मानक स्प्लिट व्यू आईपैड ऐप है। मैंने फिर बर्खास्तगी को संभालने के लिए मेरे विस्तार नियंत्रक (पॉप ओवर के मालिक) पर एक विधि जोड़ा।

मानक विभाजित दृश्य आर्किटेक्चर पर, रूट और विवरण दृश्य नियंत्रक दोनों ऐप प्रतिनिधि के माध्यम से उपलब्ध हैं। तो मैंने ऐप प्रतिनिधि को प्राप्त करने वाली विधि को कॉल करने के लिए पॉप ओवर के अंदर एक बटन क्लिक किया। वहां से मैं पॉप ओवर को खारिज करने के लिए विस्तार नियंत्रक पर विधि को कॉल करता हूं।

- (void) exitView: (id)sender { 
    MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    [appDelegate.detailViewController exitDrill]; 
} 

फिर विस्तार से देखें नियंत्रक पर खारिज करने के लिए सरल विधि:

- (void) exitDrill { 
    if(dtController != nil){ 
     [dtController dismissPopoverAnimated: YES]; 
     [dtController release]; 
    } 
} 

मुझे पसंद

यह दृश्य नियंत्रक पर विधि है कि पॉपओवर अंदर प्रदर्शित किया जाता है के लिए कोड है ऐसा करने की क्षमता क्योंकि यह मुझे उपयोगकर्ता को दिखाने का एक तरीका देती है कि वे पॉप ओवर से कैसे बाहर निकल सकते हैं। ऐप के भविष्य के संस्करणों में यह आवश्यक नहीं हो सकता है; अभी के लिए, जबकि यह प्रतिमान प्लेटफॉर्म पर अभी भी नया है, मैं उपयोगकर्ताओं को निराशा को कम करने के लिए कुछ अलग-अलग तरीकों से एक प्रदर्शन को प्रदर्शित करना पसंद करता हूं।

5

आप केवीसी के साथ "पॉपओवर कंट्रोलर" तक पहुंचकर प्रस्तुत पॉपओवर नियंत्रक तक पहुंच सकते हैं।

[[self valueForKey:@"popoverController"] dismissPopoverAnimated:YES] 
+1

स्मार्ट, लेकिन इसका कोई मौका "निजी एपीआई का उपयोग करके" टैग किया जा रहा है और ऐप को खारिज कर दिया जा रहा है भले ही तकनीकी रूप से यह निजी एपीआई का उपयोग नहीं कर रहा है? –

+0

हां @ चिंतन। ऐपस्टोर द्वारा इसे संभावित रूप से खारिज कर दिया जाता है यदि उन्हें पता चलता है कि आपका कोड उनके "निजी एपीआई" का उपयोग कर रहा है। –

+0

@ जेसनमिंग यह एकमात्र चीज है जो मेरे लिए काम करती है, और मैंने समाधान खोजने की कोशिश में 5 घंटे का सर्वश्रेष्ठ हिस्सा बिताया है। बहुत बहुत धन्यवाद ... –

0

एड मार्टी जैसा कि पहले ही

आप एक बटन को दबाकर एक पॉपओवर खारिज करने के लिए चाहते हैं, तो लिखा है, कुछ जगह प्रासंगिक पॉपओवर

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

ऐसा करने के लिए, आप निम्न कोड कर सकते हैं, जिसका उपयोग मैं अपने कोड में करता हूं। वर्ग पॉपओवर खोलने में, यह मेरा कोड है:

- (void)showInformationForView:(Booking*)booking frame:(CGRect)rect 
{ 
    BookingDetailsViewController *bookingView = [[BookingDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped booking:booking]; 
    [bookingView setDelegate:self]; 

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:bookingView]; 

    self.popController = [[UIPopoverController alloc] initWithContentViewController:navController]; 
    [self.popController setDelegate:self]; 
    [self.popController setPopoverContentSize:CGSizeMake(320, 320)]; 

    rect.size.width = 0; 

    [self.popController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; 
} 

- (void)dismissPopoverAnimated:(BOOL)animated 
{ 
    [self.popController dismissPopoverAnimated:animated]; 
} 

तो मैं यहाँ क्या कर रहा हूँ एक UINavigationController बनाने और उसके rootViewController के रूप में एक BookingDetailsViewController स्थापित कर रही है। फिर मैं इस श्रेणी को BookingDetailsViewController पर प्रतिनिधि के रूप में भी जोड़ रहा हूं।

दूसरी चीज़ जो मैंने जोड़ा वह एक बर्खास्तगी विधि है जिसे dismissPopoverAnimated:animated कहा जाता है।

मेरी BookingDetailsViewController.h में मैं निम्नलिखित कोड कहा:

[...] 
@property (nonatomic, strong) id delegate; 
[...] 

और मेरे BookingDetailsViewController.m में मैं इस कोड कहा:

[...] 

@synthesize delegate = _delegate; 

- (void)viewDidLoad 

{ 
    UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(closeView)]; 
    [self.navigationItem setRightBarButtonItem:closeButton]; 

    [super viewDidLoad]; 
} 

- (void)closeView 
{ 
    if ([self.delegate respondsToSelector:@selector(dismissPopoverAnimated:)]) { 
     [self.delegate dismissPopoverAnimated:YES]; 
    } 
    else { 
     NSLog(@"Cannot close the view, nu such dismiss method"); 
    } 
} 

[...] 

क्या होता यह है कि जब "बंद" UINavigationController में बटन है दबाया गया, विधि closeView कहा जाता है। यह विधि जांचें कि प्रतिनिधि dismissPopoverAnimated:animated का जवाब देता है और यदि ऐसा है, तो यह इसे कॉल करता है। यदि यह इस विधि का जवाब नहीं देता है तो यह एक लॉग संदेश दिखाएगा और कुछ और नहीं करेगा (इसलिए यह क्रैश नहीं होगा)।

मैंने एआरसी का उपयोग करके अपना कोड लिखा है, इसलिए कोई स्मृति प्रबंधन नहीं है।

मुझे आशा है कि यह आप में मदद की।