此错误表示什么:
“无法从没有窗口的视图中呈现弹出窗口。”
救了我一命的东西:
if (self.view.window != nil)
[popoverController presentPopoverFromRect:CGRectMake(44, yCoord, 111, 111) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
通过添加 if 条件它不再崩溃。我真的不明白,因为该presentPopoverFromRect
函数总是被调用。没有窗口会为零的情况,但无论如何它确实成功了。
编辑:我在viewDidAppear
. 尽管如此,在大多数情况下,移动presentPopoverFromRect
到viewDidAppear
或者didMoveToWindow
但在我的情况下由于某种原因 if 条件是必要的就足够了。
您要添加弹出框的视图必须已经使用“addSubview:”方法添加到窗口中。
试着等到
- (void) didMoveToWindow
为视图调用,然后加载弹出框
我遇到了这个问题。
我有一个UITabBarController
作为详细视图,我在标签栏中的所有三个导航控制器上将 barButtonItem 设置为 leftBarButtonItem。
vcChart.navigationItem.leftBarButtonItem = barButtonItem;
vcAnalysis.navigationItem.leftBarButtonItem = barButtonItem;
vcTechnicals.navigationItem.leftBarButtonItem = barButtonItem;
原来只有最后一个添加是有效的,前两个在点击时会抛出异常。
为了解决这个问题,我只为可见视图控制器设置了 leftBarButtonItem,并且每次用户切换选项卡时都将 barButtonItem 切换到可见视图控制器。
刚遇到这个问题。原来 inView: 参数正在使用未在 IB 中连接的 IBOutlet。因此,尝试在 nil 中启动弹出框。那是行不通的。
因此,请确保您使用的是有效视图。
有很多方法可以解决此错误。基本上你需要等待调用presentPopover
命令,直到你的调用视图被添加到窗口中。我是这样做的。
- (void)viewDidAppear:(BOOL)animated
{
[self methodThatDisplaysPopOver];
}
我的presentPopoverFromRect
电话在我的methodThatDisplaysPopOver
功能内。
您可以像 MobiMaciek 建议的那样保护每个 presentPopover 调用。
if (self.view.window != nil)
[popoverController presentPopoverFromRect:CGRectMake(10, 10, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
但是,我认为最好了解 self.view.window 何时被分配并确保在视图有窗口后呈现弹出窗口。
UIBarButtonItem
在将相同的内容分配给多个导航项时,我收到了与 Lewis 相同的错误消息。我的示例稍微复杂一些,因为我使用的是UISplitViewController
.
在我RootViewController
的表中,我有一组数组来完成表中的多个部分。每次用户单击表格中的一行时,都会在我的 splitViewController 的右窗格中放置一个新的“详细”视图控制器。在设置之前leftBarButtonItem = nil
,我会在单击“菜单”按钮 3-4 次后收到段错误,错误与 a111 相同。我更新了我的代码以实际检索以前的详细视图控制器并将 leftBarButtonItem 项设置为 nil。
allData
是我的 NSMutableArray,它包含其他几个 NSMutableArrays 作为对象。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Retrieve the new detail view controller
UIViewController *detailViewController = [[self.allData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
// Add the detail view controller to a navigation controller and set the bar style
UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
detailNavigationController.navigationBar.barStyle = [[NSUserDefaults standardUserDefaults] integerForKey:@"UIBarStyle"];
// Retrieve previous detail view controller and remove the leftBarButtonItem
UINavigationController *previousDetailNavigationController = [splitViewController.viewControllers objectAtIndex:1];
UIViewController *previousDetailViewController = [[previousDetailNavigationController viewControllers] lastObject];
previousDetailViewController.navigationItem.leftBarButtonItem = nil;
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailNavigationController, nil];
splitViewController.viewControllers = viewControllers;
[detailNavigationController release];
[viewControllers release];
// Dismiss the popover if it's present.
if (popoverController != nil) {
[popoverController dismissPopoverAnimated:YES];
}
// This sets the left bar to nil when in landscape and equal to "Menu" when in portrait.
// We need to remove rootPopoverButtonItem from the previous viewController...
detailViewController.navigationItem.leftBarButtonItem = rootPopoverButtonItem;
}
错误消息起初有点欺骗性,但上面的答案帮助了我。我想知道为什么我可以在段错误之前最多点击“菜单”按钮 3-4 次......我会进一步调查。
这个错误在inView的时候也会出现:Parameter is wrong - to test try self.view
是的,你是对的,但我们仍然可以在其中添加父类的子视图。所以它可以从一个有窗口的视图中表示:
[popoverController.contentViewController.view addSubview:mySubView];
我有与 OP 相同的错误消息,情况与 TPoschel 报告的情况非常相似,除了我有一个拆分视图控制器,在详细信息窗格中有一个嵌入的选项卡栏控制器,还有一个导航控制器。栏按钮项添加为导航栏 leftBarButtonItem。
只有在 iOS5.0(不是 5.1)上,它似乎要求您通过将要离开的选项卡栏上的栏按钮项设置为 nil 来使其无效。在此之前,将栏按钮添加到您要前往的选项卡上的导航栏。
如果我不这样做,通过调试我自己的代码,栏按钮项的 window 属性将保持设置为 nil,并在返回到您之前访问过的屏幕时导致异常。我猜是在导航项中设置 leftBarButtonItem 的副作用,它会熄灭并设置框架。但它似乎并不麻烦,除非按钮与当前设置的按钮不同。因此,在离开选项卡时需要将其设置为 nil,即使它在技术上与传递的按钮相同。
我会赞成 TPoschel 的回答,但 SO 不会让我这样做。
我有这样的问题。UIBarButton
单击使用 did performSeque 调用选择器方法的自定义项时收到此消息。
问题是我的 segue 仍然附在该UIBarButton
项目上。它应该已附加到视图控制器的主视图。改变了这个并且工作正常。
PS,这一切都开始了,因为我想在我的UIToolBar
. 这不是系统提供的列表中的一个,应该是。
将有一个视图,您要求从中显示您的弹出窗口。此错误的原因是因为您没有将此视图作为窗口的子视图。
[self.view addSubview:displayPopOverVC];
其中 displayPopOverVC 是 popOver 出现的视图控制器
我遇到了同样的问题,在viewDidAppear中添加PresentPopOver后,问题就解决了
- (void) viewDidAppear:(BOOL)animated{
CGRect popoverRect = screenBounds;
popoverRect.size.width = MIN(popoverRect.size.width,0) ;
popoverRect.origin.x = screenBounds.origin.x;
[popoverController
presentPopoverFromRect:popoverRect
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
发生这种情况是因为 inView:self.view 应该按照@hey68You 和 MobiMaciek 的建议在 viewDidLoad 之后调用。
我换了
[actionSheet showFromBarButtonItem:self.navigationController.navigationItem.leftBarButtonItem animated:YES];
和
[actionSheet showInView:self.view];