2011-02-08 36 views
6

Bazı çalışmalardan sonra, düzgün bir şekilde görünen özel bir görünümün görüntülendiği bir popover görünümüm var. Popover görünümünün dışına dokunduğunuzda, beklendiği gibi reddeder, ancak içinde bir düğme tıklandığında işten atılmasını isterim, bununla ilgili bana yardımcı olabilecek kimse var mı? Özlü bir rehber bulmak için uğraşmak.Uygun şekilde kapatmak için popover görünümleri nasıl ayarlanır

cevap

12

Popover'i el ile kapatmak için, bir referansı saklamanız gerekir. Popover'i gösteren kontrolörde iyi bir yer olurdu.

İçerik görünümü denetleyicisinin içindeki düğmeyi, popover'ı kapatmak için orijinal görünüm denetleyicisine (popover'i gösteren) bildirmek için, olası iki yol delege + protokolü veya NSNotificationCenter'dır.

Aşağıdaki örnek kod, NSNotificationCenter kullanır. popover ("PresenterViewController") sunulur görünümü denetleyicisi .h

, popoverViewController için bir özellik ekleyin:

@interface PresenterViewController : UIViewController { 
    ... 
    UIPopoverController *popoverController; 
}  
... 
@property (nonatomic, retain) UIPopoverController *popoverController; 
@end 

PresenterViewController arasında .m olarak:

@synthesize popoverController; 
... 
- (void)showPopover 
{ 
    if (self.popoverController == nil) 
    { 
     ContentFooViewController *content = 
      [[ContentFooViewController alloc] init]; 
     UIPopoverController *popover = [[UIPopoverController alloc] 
      initWithContentViewController:content]; 
     [content release]; 
     self.popoverController = popover; 
     [popover release]; 

     // Listen for the "done" notification which will be posted 
     // by the button in the content view controller. 
     // When the notification is received, 
     // call the contentFooViewControllerDone: method... 
     [[NSNotificationCenter defaultCenter] 
      addObserver:self 
      selector:@selector(contentFooViewControllerDone:) 
      name:@"contentFooViewControllerDone" 
      object:popoverController.contentViewController]; 
    } 

    [self.popoverController presentPopoverFromRect:... 
     // OR 
    [self.popoverController presentPopoverFromBarButtonItem:... 
} 

- (void)contentFooViewControllerDone:(NSNotification *)notification 
{ 
    // Button in content view controller was tapped, dismiss popover... 
    [self.popoverController dismissPopoverAnimated:YES]; 
} 

- (void)dealloc 
{ 
    //stop listening for notifications and release popoverController... 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [popoverController release]; 
    [super dealloc]; 
} 

İçerik görünümü denetleyicisinde, düğme vurma yöntemini aşağıdaki gibi uygulayın:

- (IBAction)dismissButtonTapped 
{ 
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"contentFooViewControllerDone" object:self]; 
} 
+2

One Bu yaklaşıma yönelik uyarı, dışa dokunarak popover'ı kapatırsanız, yine de bir referansınız olduğu için asla düzgün bir şekilde reddedilmez. Ekstra bir denetleyici kontrol etmeyi düşünmüyorsanız, bu iyi bir şeydir, ancak tipik olarak bellek bir prim düzeyindedir ve bunu yapmak istemezsiniz. Yani, '- (void) popoverControllerDidDismissPopover: (UIPopoverController *) popoverController' özelliğini de kullanmalısınız. – memmons

+0

@Hark: İyi nokta, teşekkürler. – Anna

+0

Bu harika - diğerleri için de Apple'ın bir düğmeyi sadece bir popover'ı kapatmak için kullanmasını engellediğini unutmayın. Uygulamanızın bu düğme ile başka bir şey yapması muhtemeldir, bu da gayet iyi. :) – ekinnear

İlgili konular