如何设置弹出视图以正确解除

Dav*_*6th 7 cocoa-touch ipad uipopovercontroller

经过一些工作后,我有一个弹出视图,显示其内部的自定义uiview正常显示.当你点击popover视图之外它会按预期解散,但是我也希望当它内部的按钮被点击时它会被忽略,有没有人可以帮助我?苦苦寻找简明指南.

小智 12

要手动关闭弹出窗口,您需要保留对它的引用.一个好的地方是在视图控制器中显示弹出窗口.

要让内容视图控制器内的按钮告诉原始视图控制器(显示弹出窗口)以解除弹出窗口,可能的两种方法是委托+协议或NSNotificationCenter.

以下示例代码使用NSNotificationCenter.

在显示popover("PresenterViewController")的视图控制器的.h中,为popoverViewController添加一个属性:

@interface PresenterViewController : UIViewController {
    ...
    UIPopoverController *popoverController;
}    
...
@property (nonatomic, retain) UIPopoverController *popoverController;
@end
Run Code Online (Sandbox Code Playgroud)

在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];
}
Run Code Online (Sandbox Code Playgroud)

在内容视图控制器中,按如下方式实现按钮点击方法:

- (IBAction)dismissButtonTapped
{
    [[NSNotificationCenter defaultCenter] 
        postNotificationName:@"contentFooViewControllerDone" object:self];
}
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的一个警告是,如果你通过点击它来关闭弹出窗口,它将永远不会被正确解散,因为你仍然有它的引用.如果你不介意保留一个额外的视图控制器,这很好,但通常内存是非常宝贵的,你不想这样做.所以,你也应该使用` - (void)popoverControllerDidDismissPopover:(UIPopoverController*)popoverController`将属性设置为nil. (2认同)