【问题标题】:-[UIPopoverController dealloc] reached while popover is still visible- [UIPopoverController dealloc] 在 popover 仍然可见时达到
【发布时间】:2014-01-26 04:30:00
【问题描述】:

我有一个类 (ViewOpenAppointments),我在其中创建和显示 UIPopover。这是在我的 .h 文件中定义弹出框的代码:

@interface ViewOpenAppointments : UIView  {

}

@property (nonatomic, retain) UIPopoverController *popoverController;
-(void)createOpenAppointmentsPopover: (UIButton *) obViewOpenAppts;
@end

我检查了代码,如果弹出框可见,则将其关闭。这是代码:

    //  create popover
UIViewController* popoverContent = [[UIViewController alloc] init];
//    UIView *popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 650, 416)];
ViewOpenAppointments *popoverView = [[ViewOpenAppointments alloc]     initWithFrame:CGRectMake(0, 0, 650, 416)];

popoverView.backgroundColor = [UIColor whiteColor];
popoverContent.preferredContentSize = CGSizeMake(650.0, 416.0);

//  create the popover controller
popoverController = [[UIPopoverController alloc]  initWithContentViewController:popoverContent];
popoverController.delegate = (id)self;
[popoverController setPopoverContentSize:CGSizeMake(650, 416) animated:NO];

if ([popoverController isPopoverVisible]) {
    [popoverController dismissPopoverAnimated:YES];
}

[popoverController presentPopoverFromRect:CGRectMake(650, 416, 10, 50) inView: obViewOpenAppts
                 permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

问题是关闭弹出框的代码永远不会被命中,这意味着它不可见。但我仍然收到错误消息(在问题标题中描述)。

我做错了什么?

【问题讨论】:

  • 如果您不保留控制器,即使在可见时它也会被释放并且您不保留
  • 控制器被保留...查看.h文件中的代码
  • 不是 ;) 这就是“问题”所显示的内容。您需要向我们展示谁持有显示弹出窗口的 ViewOpenAppointments 实例
  • 我该怎么做? (我所有的代码都在上面,所以请告诉我我需要改变什么):D

标签: objective-c uiview uiviewcontroller ios7 uipopover


【解决方案1】:

这是一个完整的popover管理示例:

@interface ViewController () <UIPopoverControllerDelegate>
@property (nonatomic, strong) UIPopoverController* currentPop;
@end

@implementation ViewController     

-(IBAction)doPopover1:(id)sender {
    Popover1View1* vc = [[Popover1View1 alloc] initWithNibName:@"Popover1View1" bundle:nil];

    UIPopoverController* pop = [[UIPopoverController alloc] initWithContentViewController:vc];
    self.currentPop = pop;
    [pop presentPopoverFromBarButtonItem:sender
                permittedArrowDirections:UIPopoverArrowDirectionAny
                                animated:YES];
    pop.passthroughViews = nil;
    // make ourselves delegate so we learn when popover is dismissed
    pop.delegate = self;
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)pc {
    self.currentPop = nil;
}

通过检查self.currentPop,您可以确保您不会同时呈现两个弹出框(无论如何都是非法的)。

【讨论】:

  • 请注意,如果您确实尝试使用此代码一次呈现两个弹出框,您将得到您所收到的确切消息,因为您将再次设置currentPop,从而释放之前的@987654324 @ 仍在控制第一个仍在运行的弹出窗口。
  • 谢谢马特......我会处理它并回复你们两个...... SD
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多