拯救我生命的东西:
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;
有很多方法可以导致这个错误。基本上,您需要等待调用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并确保在视图拥有窗口后再展示弹出视图。
刚遇到了这个问题。事实证明,inView:参数在IB中没有连接的IBOutlet被使用了。因此,试图在nil中启动弹出窗口是不起作用的。
所以,请确保您正在使用有效的视图。
当我像Lewis一样将同一个UIBarButtonItem
分配给多个导航项时,我收到了相同的错误消息。我的示例稍微复杂一些,因为我正在使用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次不同的次数...我会进一步调查。
是的,你说得对,但我们仍然可以从父类中添加子视图。因此,它可以表示为一个具有窗口的视图:
[popoverController.contentViewController.view addSubview:mySubView];
当inView参数不正确时,也会出现此错误 - 请尝试使用self.view进行测试
- (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];
}
这是由于@hey68You和MobiMaciek建议在viewDidLoad之后调用inView:self.view。
我替换了
[actionSheet showFromBarButtonItem:self.navigationController.navigationItem.leftBarButtonItem animated:YES];
使用
[actionSheet showInView:self.view];