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];
但我使用内存作为双重分配存在。如何解决此问题
答案 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
}