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”实例变量指向该实例。