当UITableView第二次单击时,应用程序崩溃

时间:2015-04-20 13:47:50

标签: ios objective-c uitableview uipopovercontroller

MyVC* bottle = [[MyVC alloc] initWithDelegate:self];
bottle.title = @"bottle";

if ( water == nil )
    water = [[UIPopoverController alloc] initWithContentViewController:bottle];
else
    water.contentViewController = bottle;

此代码运行一次....当我再次点击UITableViewCell我的应用程序崩溃时... 我无法弄清楚为什么?

ERROR

 -[UIPopoverController setContentViewController:animated:] can only be called after the popover has been presented.'

注意将我的代码更改为以下内容时:

MyVC* bottle = [[MyVC alloc] initWithDelegate:self];
bottle.title = @"bottle";

if ( water == nil )
    water = [[UIPopoverController alloc] initWithContentViewController:bottle];
else
    water = [[UIPopoverController alloc] initWithContentViewController:bottle];

但我使用内存作为双重分配存在。如何解决此问题

3 个答案:

答案 0 :(得分:1)

您在UIPopoverController的初始化,演示和内容修改之间存在混淆。

将弹出窗口存储在实例变量上是可以的,以避免每次都重新创建它。如果已经存在“water”,则将contentViewController设置为“Bottle”的新实例也不会造成任何麻烦。

但是您的错误消息说明了一切:-[UIPopoverController setContentViewController:animated:]:您正尝试使用动画更改弹出窗口的内容。这意味着,您的弹出窗口必须已经呈现(即可见)。为此,请在更改其内容之前使用以presentPopoverFrom... 开头的两种方法之一。

换句话说,只有呈现弹出窗口后,您才能对内容进行动画处理。另请注意,当弹出窗口尚未显示/可见时,为更改设置动画是没有意义的。使用setter .contentViewController =(或非动画方法)。

关于编辑/注释的注释:在if / else子句的两个分支中写入相同的分配是没有意义的。并且它不会导致系统使用两次内存。因为当编译器看到第二行(“else”...)时,它首先释放popovercontroller的现有实例,然后再分配新的实例并使“water”实例变量指向它。

答案 1 :(得分:0)

如果你想推,那就试试这个

MyVC *Newpage = [[MyVC alloc] initWithNibName:@"MyVC" bundle:nil];
    [self.navigationController pushViewController:Newpage animated:YES];

如果你想从这个页面返回,那么弹出然后使用它 您使用的代码错误。

[self.navigationController popViewControllerAnimated:YES];

答案 2 :(得分:0)

隐藏弹出窗口视图存在问题。检查是否正确显示。

if (popover == nil) {

        popover = [[UIPopoverController alloc] initWithContentViewController: MYVC]; 
        popover.delegate = self;

        [self.tablesPopoverController presentPopoverFromBarButtonItem:sender 
            permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

使用委托方法检查弹出窗口是否可见。

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    // do something now that it's been dismissed
}