UITableViewController :“无法从没有窗口的视图中呈现弹出框。”

Posted

技术标签:

【中文标题】UITableViewController :“无法从没有窗口的视图中呈现弹出框。”【英文标题】:UITableViewController : "Popovers cannot be presented from a view which does not have a window. " 【发布时间】:2013-09-24 07:15:16 【问题描述】:

我开发了 iPad 应用程序。屏幕中有一个表格视图。如果用户单击任何单元格,那么我会打开弹出框。我遇到这样的错误非常罕见

Fatal Exception NSInvalidArgumentException
-[UIPopoverController _commonPresentPopoverFromRect:inView:permittedArrowDirections:animated:]: Popovers cannot be presented from a view which does not have a window. 

使用以下方法;

UIViewController *contentViewController = [[UIViewController alloc] init];
[contentViewController.view setFrame:CGRectMake(0, 0, 320, 460)];
UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:contentViewController] autorelease];

self.popOver=[[UIPopoverController alloc] initWithContentViewController:navController];
self.popOver.delegate = self;

CGRect rectInTableView = [self.menuItems rectForRowAtIndexPath:tableRowID];
CGRect rectInSuperview = [self.menuItems convertRect:rectInTableView toView:self.view];
rectInSuperview.size.width=320;

[self.popOver presentPopoverFromRect:rectInSuperview inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
[contentViewController release];

【问题讨论】:

if (self.view.window != nil) [self.popOver presentPopoverFromRect:rectInSuperview inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; 【参考方案1】:

这意味着self.view 不在屏幕上。尝试跟踪 self 以查看您指的是哪个视图控制器。

【讨论】:

【参考方案2】:

它给出错误因为你的视图不在屏幕上

你可以这样试试,

 CGRect rect = [tableView convertRect:[tableView rectForRowAtIndexPath: tableRowID]
                                      toView:tableView];

  [self.popOver presentPopoverFromRect:rect
                                           inView:tableView
                         permittedArrowDirections:UIPopoverArrowDirectionLeft
                                         animated:YES];

【讨论】:

【参考方案3】:

试试这个它会帮助你。 只需从 tableView 中找出选定的单元格。

UITableViewCell * cell = [tab cellForRowAtIndexPath:tableRowID];

[self.popOver presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
[contentViewController release];

【讨论】:

【参考方案4】:

你做过这个工作吗? UINavigationControllerUIViewController 的子类,但它不是 Apple 在他们的 View Controller Programming guide 中记录的 ContentViewControllerUIViewControllerUITableViewController)。

无论如何,几周前我收到了同样的消息,我将其作为错误报告给 Apple。在我的情况下,如果我使用导航控制器进入视图层次结构,一旦我弹出到根目录并打开一个弹出窗口(从根视图),它会报告 self.View 没有任何窗口。我的解决方案是更改代码以使用现有的 NavigationBar 作为锚视图而不是 self.view。代码如下:

[popover presentPopoverFromRect:CGRectMake(0, 0, 1,self.navigationController.navigationBar.bounds.size.height) inView:self.navigationController.navigationBar permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];  

【讨论】:

相同的代码适用于 ios 6.1,但不适用于 IOS 7 SDK。只要您不向上导航层次结构和poptoroot,相同的代码就可以工作。使用我的代码,我尝试使用不同的对象 UIButtons 作为具有相同结果的锚 您也可以查看此链接 - 似乎与您得到的类似 ***.com/questions/3377001/…

以上是关于UITableViewController :“无法从没有窗口的视图中呈现弹出框。”的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController、sectionNameKeyPath 和无数据日期的部分

如何将选定的 UITableViewController 值添加到以前的 UITableViewController?

在动态 UITableViewController 的标头中嵌入静态 UITableViewController

当转到另一个 UITableViewController 时 UITableViewController 冻结

重新加载 UITableViewController

删除单元格 - UITableviewController