【问题标题】:How to setup Popover views to dismiss properly如何设置 Popover 视图以正确关闭
【发布时间】:2011-02-08 19:16:06
【问题描述】:

经过一些工作,我得到了一个弹出视图,其中显示了一个自定义 uiview,其中显示正确。 当您在弹出视图之外点击时,它会按预期关闭,但是我也希望它在点击其中的按钮时关闭,有没有人可以帮助我解决这个问题?努力寻找简明的指南。

【问题讨论】:

    标签: cocoa-touch ipad uipopovercontroller


    【解决方案1】:

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

    要让内容视图控制器中的按钮告诉原始视图控制器(呈现弹出框的)关闭弹出框,两种可能的方式是委托+协议或 NSNotificationCenter。

    下面的示例代码使用NSNotificationCenter

    在呈现popover的视图控制器(“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];
    }
    

    【讨论】:

    • 对这种方法的一个警告是,如果您通过在弹出窗口外部点击来关闭它,它将永远不会被正确关闭,因为您仍然有它的引用。如果您不介意保留一个额外的视图控制器,这很好,但通常内存非常宝贵,您不想这样做。因此,您还应该使用- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 将属性设置为nil。
    • 这很棒 - 对于其他人来说,还请注意,Apple 不鼓励使用按钮来关闭弹出窗口。您的应用程序可能还使用该按钮执行其他操作,这很好。 :)
    • @AnnaKarenina。嗨,有没有办法检查 nsnotificationcenter 是否还没有被释放?我尝试了这种方法,但似乎在触发 nsnotification 观察者后流程没有通过 -(void)dealloc{} 部分。
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多