एड मार्टी जैसा कि पहले ही
आप एक बटन को दबाकर एक पॉपओवर खारिज करने के लिए चाहते हैं, तो लिखा है, कुछ जगह प्रासंगिक पॉपओवर
के लिए एक संदर्भ रखना चाहिए यह बिल्कुल सच है ; हालांकि, जब 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
का जवाब देता है और यदि ऐसा है, तो यह इसे कॉल करता है। यदि यह इस विधि का जवाब नहीं देता है तो यह एक लॉग संदेश दिखाएगा और कुछ और नहीं करेगा (इसलिए यह क्रैश नहीं होगा)।
मैंने एआरसी का उपयोग करके अपना कोड लिखा है, इसलिए कोई स्मृति प्रबंधन नहीं है।
मुझे आशा है कि यह आप में मदद की।
धन्यवाद। मैं कोड बदल दूंगा! – SpaceDog
दूसरा अनुच्छेद इस उत्तर में अत्यंत महत्वपूर्ण है। याद रखें, आईपैड प्रोग्रामिंग गाइड के मुताबिक: "जागरूक रहें, हालांकि, पॉपओवर नियंत्रक के संदर्भ को स्टोर करना आपकी ज़िम्मेदारी है ताकि आप इसे खारिज कर सकें। सिस्टम डिफ़ॉल्ट रूप से एक प्रदान नहीं करता है।" इसलिए, जब तक पैरेंट व्यू डेलोक चरण में प्रवेश नहीं कर लेता है, तब तक "रिलीज़]" न करें (वैसे भी दुर्घटना हो जाएगी)। (वह मेरी सुरक्षा विधि है)। – Jann
बस [self dismissViewControllerAnimated: YES समापन: शून्य] का उपयोग करें; "प्रेजेंटिंग व्यू कंट्रोलर प्रस्तुत दृश्य नियंत्रक को खारिज करने के लिए ज़िम्मेदार है। अगर आप इस विधि को प्रस्तुत दृश्य नियंत्रक पर ही कॉल करते हैं, तो यह स्वचालित रूप से प्रस्तुत करने वाले दृश्य नियंत्रक को संदेश अग्रेषित करता है।" –