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】:你做过这个工作吗?
UINavigationController
是 UIViewController
的子类,但它不是 Apple 在他们的 View Controller Programming guide 中记录的 ContentViewController
(UIViewController
或 UITableViewController
)。
无论如何,几周前我收到了同样的消息,我将其作为错误报告给 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