53

此错误表示什么:

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

13 回答 13

30

救了我一命的东西:

if (self.view.window != nil)
    [popoverController presentPopoverFromRect:CGRectMake(44, yCoord, 111, 111) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

通过添加 if 条件它不再崩溃。我真的不明白,因为该presentPopoverFromRect函数总是被调用。没有窗口会为零的情况,但无论如何它确实成功了。

编辑:我在viewDidAppear. 尽管如此,在大多数情况下,移动presentPopoverFromRectviewDidAppear或者didMoveToWindow但在我的情况下由于某种原因 if 条件是必要的就足够了。

于 2011-08-26T10:01:25.903 回答
24

您要添加弹出框的视图必须已经使用“addSubview:”方法添加到窗口中。

试着等到

- (void) didMoveToWindow

为视图调用,然后加载弹出框

于 2010-08-01T07:58:58.217 回答
4

我遇到了这个问题。

我有一个UITabBarController作为详细视图,我在标签栏中的所有三个导航控制器上将 barButtonItem 设置为 leftBarButtonItem。

vcChart.navigationItem.leftBarButtonItem = barButtonItem;
vcAnalysis.navigationItem.leftBarButtonItem = barButtonItem;
vcTechnicals.navigationItem.leftBarButtonItem = barButtonItem;

原来只有最后一个添加是有效的,前两个在点击时会抛出异常。

为了解决这个问题,我只为可见视图控制器设置了 leftBarButtonItem,并且每次用户切换选项卡时都将 barButtonItem 切换到可见视图控制器。

于 2011-03-03T20:32:21.180 回答
2

刚遇到这个问题。原来 inView: 参数正在使用未在 IB 中连接的 IBOutlet。因此,尝试在 nil 中启动弹出框。那是行不通的。

因此,请确保您使用的是有效视图。

于 2010-08-15T20:26:47.860 回答
2

有很多方法可以解决此错误。基本上你需要等待调用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 何时被分配并确保在视图有窗口后呈现弹出窗口。

于 2013-06-04T17:33:44.853 回答
1

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 次......我会进一步调查。

于 2011-06-29T15:57:25.727 回答
1

这个错误在inView的时候也会出现:Parameter is wrong - to test try self.view

于 2012-02-06T12:53:52.550 回答
1

是的,你是对的,但我们仍然可以在其中添加父类的子视图。所以它可以从一个有窗口的视图中表示:

[popoverController.contentViewController.view addSubview:mySubView];
于 2013-07-25T07:15:10.063 回答
0

我有与 OP 相同的错误消息,情况与 TPoschel 报告的情况非常相似,除了我有一个拆分视图控制器,在详细信息窗格中有一个嵌入的选项卡栏控制器,还有一个导航控制器。栏按钮项添加为导航栏 leftBarButtonItem。

只有在 iOS5.0(不是 5.1)上,它似乎要求您通过将要离开的选项卡栏上的栏按钮项设置为 nil 来使其无效。在此之前,将栏按钮添加到您要前往的选项卡上的导航栏。

如果我不这样做,通过调试我自己的代码,栏按钮项的 window 属性将保持设置为 nil,并在返回到您之前访问过的屏幕时导致异常。我猜是在导航项中设置 leftBarButtonItem 的副作用,它会熄灭并设置框架。但它似乎并不麻烦,除非按钮与当前设置的按钮不同。因此,在离开选项卡时需要将其设置为 nil,即使它在技术上与传递的按钮相同。

我会赞成 TPoschel 的回答,但 SO 不会让我这样做。

于 2012-06-04T13:50:25.970 回答
0

我有这样的问题。UIBarButton单击使用 did performSeque 调用选择器方法的自定义项时收到此消息。

问题是我的 segue 仍然附在该UIBarButton项目上。它应该已附加到视图控制器的主视图。改变了这个并且工作正常。

PS,这一切都开始了,因为我想在我的UIToolBar. 这不是系统提供的列表中的一个,应该是。

于 2012-07-04T00:25:10.167 回答
0

将有一个视图,您要求从中显示您的弹出窗口。此错误的原因是因为您没有将此视图作为窗口的子视图。

 [self.view addSubview:displayPopOverVC];

其中 displayPopOverVC 是 popOver 出现的视图控制器

于 2012-12-03T06:29:02.923 回答
0

我遇到了同样的问题,在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 之后调用。

于 2013-01-22T09:19:23.797 回答
0

我换了

[actionSheet showFromBarButtonItem:self.navigationController.navigationItem.leftBarButtonItem animated:YES];

[actionSheet showInView:self.view];
于 2013-08-18T19:30:00.793 回答