2012-04-25 16 views
6

मैं यूआईपीओप अप कंट्रोलर के साथ खेलना चाहता था, और मुझे समझ में आया कि जब मैं अपने पॉपओवर को खारिज कर देता हूं तो मुझे पता नहीं लगा सकता। मेरे कदम:
1. XCode से उदाहरण बनाएँ (फ़ाइल -> नया प्रोजेक्ट -> Utilitiy आवेदन)
2. जोड़ें UIPopoverControllerDelegateपॉपओवर खारिज का पता लगाना

#import "FlipsideViewController.h" 

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate,UIPopoverControllerDelegate> 

@property (strong, nonatomic) UIPopoverController *flipsidePopoverController; 

- (IBAction)showInfo:(id)sender; 

@end 
  1. MainViewController.h को MainViewController में:
 

    - (IBAction)showInfo:(id)sender 
    { 
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
      FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; 
      controller.delegate = self; 
      controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
      [self presentModalViewController:controller animated:YES]; 
     } else { 
      if (!self.flipsidePopoverController) { 
       FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; 
       controller.delegate = self; 

       self.flipsidePopoverController.delegate = self 

       self.flipsidePopoverController = [[UIPopoverController alloc] initWithContentViewController:controller]; 
      } 
      if ([self.flipsidePopoverController isPopoverVisible]) { 
       [self.flipsidePopoverController dismissPopoverAnimated:YES]; 
      } else { 
       [self.flipsidePopoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
      } 
     } 
    } 

    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 
    { 
     NSLog(@"OLOLO"); 
    } 

लेकिन जब मैं कहीं टैप करता हूं, और पॉपओवर गायब हो जाता है, तो कंसोल में कोई एनएसएलओजी संदेश नहीं होता है। मैं क्या गलत कर रहा हूँ?

+4

आप प्रतिनिधि सेट कर रहे हैं * * इससे पहले कि आप पॉपओवर नियंत्रक को तुरंत चालू करें। दूसरे शब्दों में, जब आप प्रतिनिधि –

+0

सत्य, सत्य सेट करते हैं तो यह अस्तित्व में नहीं होता है। आपका बहुत बहुत धन्यवाद! –

उत्तर

2

क्या आपने अपना मेनव्यू कंट्रोलर उदाहरण पॉपओवर के प्रतिनिधि के रूप में सेट किया था?

popover.delegate = self;

+0

FlipsideViewController * नियंत्रक = [[FlipsideViewController alloc] initWithNibName: @ "FlipsideViewController" बंडल: शून्य]; नियंत्रक .delegate = स्वयं; –

+0

यह पहले से ही वहां था। –

+0

क्या आप पॉपओवर बना रहे हैं?अधिक कोड पोस्ट करें –

15

आत्म करने के लिए पॉपओवर के प्रतिनिधियों की स्थापना की और भी आप उपयोग कर सकते हैं दो पॉपओवर प्रतिनिधियों आईई (आप कोड के माध्यम से पॉपओवर बनाते हैं): -

/* Called on the delegate when the popover controller will dismiss the popover. Return NO to prevent the dismissal of the view. 
*/ 
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController; 

/* Called on the delegate when the user has taken action to dismiss the popover. This is not called when -dismissPopoverAnimated: is called directly. 
*/ 
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController; 
+1

ध्यान रखें कि didDismiss फ़ंक्शन केवल तब कॉल हो जाता है जब पॉपओवर स्वयं को खारिज कर देता है, जैसे कि इसके बाहर एक स्पर्श। यदि आप इसे स्वयं अपने कोड से खारिज करते हैं (उदाहरण के लिए बटन दबाकर) तो इसे नहीं कहा जाएगा। – CMash

4

इससे पहले जवाब का उपयोग कर सुझाव दिया है UIPopoverControllerDelegate जो उद्देश्य प्राप्त करने का एकमात्र समझदार तरीका प्रतीत होता है। मैंने सोचा कि व्यावहारिक उदाहरण जोड़ना अच्छा होगा क्योंकि यह आपके सिर के दौर को पाने के लिए सबसे आसान बात नहीं है। मेरे आवश्यकता आसान था - मैं जबकि पॉपओवर दिख रहा है पृष्ठभूमि दृश्य धुंधला हो जाना चाहते थे, इसलिए यहाँ कदम हैं:

  1. एक स्टोरीबोर्ड में अपने पॉपओवर तार अप, कॉन्फ़िगर यह गंतव्य दृश्य नियंत्रक में पॉपओवर सामग्री आकार है जिम्मेदार बताते हैं।

  2. ज फ़ाइल को खोलने और कुछ इस तरह कर रही द्वारा एक UIPopoverControllerDelegate अपने स्रोत दृश्य नियंत्रक बनाओ:

    @interface MyController : UIViewController <UIPopoverControllerDelegate> 
    
  3. अवहेलना prepareForSegue, पॉपओवर के लिए प्रतिनिधि के रूप में अपने स्रोत दृश्य नियंत्रक आवंटित और फिर अल्फा सेट 0.5 बस से पहले segue गंतव्य प्रस्तुत करने के लिए:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
        UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue; 
        popover.popoverController.delegate = self; 
        self.view.alpha = 0.5; 
    } 
    
  4. पॉपओवर प्रतिनिधि विधि popoverControllerDidDismissPopover को लागू करें। अल्फा 1.0 करने के लिए वापस सेट और प्रतिनिधि के रूप में अपने आप को अनिर्दिष्ट हो बनाने के लिए यकीन है कि हम रोक नहीं एआरसी कर यह काम है:

    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
        self.view.alpha = 1.0; 
        popoverController.delegate = nil; 
    } 
    
+1

ध्यान रखें कि didDismiss फ़ंक्शन केवल तब कॉल हो जाता है जब पॉपओवर स्वयं को खारिज कर देता है, जैसे कि इसके बाहर एक स्पर्श। यदि आप इसे स्वयं अपने कोड से खारिज करते हैं (उदाहरण के लिए बटन दबाकर) तो इसे नहीं कहा जाएगा। – CMash

0
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
UIStoryboardPopoverSegue *popoverSegue; 
popoverSegue = (UIStoryboardPopoverSegue *)segue; 
popoverController = popoverSegue.popoverController; 
pCVisible = YES; 
[[segue destinationViewController] setDelegate:self]; 
} 

- (void) setDataFromPopover { 
    if (pCVisible) { 
    [popoverController dismissPopoverAnimated:YES]; // THIS IS KEY! this is where the popover is dismissed, not in the popover itself 
    } 
} 

और

//TableViewController.m 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:  (NSIndexPath *)indexPath 
{ 
    //variable = whatever 

OtherViewController *initialView; 
initialView=(OtherViewController *)self.delegate; 
initialView.theLabel.text = variable; 
[initialView setDataFromPopover]; 
} 
संबंधित मुद्दे