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

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

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

错误
 -[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];

但是我使用内存,因为存在双重分配。如何解决这个问题

最佳答案

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

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

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

换句话说,只有显示了弹出框后,您才能为内容更改制作动画。还请注意,当尚未显示/显示弹出窗口时,对更改进行动画处理是没有意义的。为此,请使用二传手.contentViewController =(或非动画方法)。

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

07-25 23:00