2011-02-08 7 views
6

몇 가지 작업을 수행 한 후에 제대로 표시되는 팝업 뷰를 사용자 정의 uiview에 표시합니다. Popover 뷰 바깥을 탭하면 예상대로 해제되지만, 그 안의 버튼이 눌러지면 해고하고 싶습니다. 저와 도울 수있는 사람이 있습니까? 간결한 가이드 찾기에 고심.Popover 뷰를 올바르게 설정 해제하는 방법

답변

12

수동으로 팝업을 닫으려면 해당 참조를 유지해야합니다. popover를 보여주는보기 컨트롤러에있는 것이 좋습니다.

콘텐츠 뷰 컨트롤러 내의 단추가 popover를 해제하기 위해 원래의보기 컨트롤러 (popover를 제시 한)에게 알리려면 가능한 두 가지 방법이 delegate + protocol 또는 NSNotificationCenter입니다.

아래 예제 코드는 NSNotificationCenter입니다. 팝 오버 ("PresenterViewController")을 제공 뷰 컨트롤러 .H에서

상기 popoverViewController 대한 속성을 추가

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

을 PresenterViewController의하는 .m에서 :

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

콘텐츠보기 컨트롤러에서 다음과 같이 버튼 누르기 방법을 구현합니다.

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

이 접근법에주의 할 점은 당신이 그것의 외부를 두드려서 popover를 닫는 것입니다, 당신이 여전히 그것에 대한 참조를 가지고 있기 때문에 그것은 결코 적절히 해산되지 않을 것입니다. 여분의 뷰 컨트롤러를 유지하는 데 신경 쓰지 않는다면 괜찮습니다.하지만 일반적으로 메모리는 프리미엄이며 사용자는이를 원하지 않습니다. 그래서, 당신은 또한'- (void) popoverControllerDidDismissPopover : (UIPopoverController *) popoverController'를 사용하여 속성을 nil로 설정해야합니다. – memmons

+0

@ 하크 : 좋은 지적, 고마워. – Anna

+0

이것은 대단한 것입니다. 다른 사람들은 애플이 단순히 팝 오버를 닫기 위해 버튼을 놓는 것을 꺼리는 것을 또한 지적합니다. 응용 프로그램에서 해당 버튼을 사용하여 다른 작업을 수행 할 가능성이 있습니다. :) – ekinnear

관련 문제