iPad的UIPopoverController“不能用`nil`调用”错误

Posted

技术标签:

【中文标题】iPad的UIPopoverController“不能用`nil`调用”错误【英文标题】:UIPopoverController for iPad "must not be called with `nil`" error 【发布时间】:2013-04-06 10:42:06 【问题描述】:

我正在尝试让 iPhone 应用程序在 iPad 上运行,但 UIPopoverController 是 返回错误。

- (IBAction)photoTapped1 
if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone)
// If in editing state, then display an image picker; if not, create and push a photo view controller.
    if (self.editing) 
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        [self presentViewController:imagePicker animated:YES completion:nil];
        [imagePicker release];
     else 
        RecipePhotoViewController *recipePhotoViewController = [[RecipePhotoViewController alloc] init];
        recipePhotoViewController.hidesBottomBarWhenPushed = YES;
        recipePhotoViewController.recipe = recipe;
        [self.navigationController pushViewController:recipePhotoViewController animated:YES];
        [recipePhotoViewController release];
    
else
    if (self.editing)
        self.popover = [[UIPopoverController alloc] initWithContentViewController:popover];
        self.popover.delegate =self;
        [popover release];
    else
         RecipePhotoViewController *recipePhotoViewController = [[RecipePhotoViewController alloc] init];
         recipePhotoViewController.hidesBottomBarWhenPushed = YES;
         recipePhotoViewController.recipe = recipe;
         [self.navigationController pushViewController:recipePhotoViewController animated:YES];
         [recipePhotoViewController release];
    

我得到的错误是: 'NSInvalidArgumentException',原因:'-[UIPopoverController initWithContentViewController:] 不能用nil 调用。'

任何可以帮助我处理此代码的人,我在互联网上查看了解决方案和示例,但似乎无法使其工作。

谢谢。

___已添加到原始问题中_____

我在这里添加 recipePhotoViewController,我假设 iPhone 和 iPad 的 ImageView 操作是相同的。

my.h 文件

@class Recipe;

@interface RecipePhotoViewController : UIViewController 
@private
    Recipe *recipe;
    UIImageView *imageView;


@property(nonatomic, retain) Recipe *recipe;
@property(nonatomic, retain) UIImageView *imageView;

@end

这是我的 .m 文件

@implementation RecipePhotoViewController

@synthesize recipe;
@synthesize imageView;

- (void)loadView 
self.title = @"Photo";

imageView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight |      UIViewAutoresizingFlexibleWidth;
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.backgroundColor = [UIColor blackColor];

self.view = imageView;   
- (void)viewWillAppear:(BOOL)animated 
imageView.image = [recipe.image valueForKey:@"image"];
- (BOOL)shouldAutorotateToInterfaceOrientation:  (UIInterfaceOrientation)interfaceOrientation  
 return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

- (void)dealloc 
[imageView release];
[recipe release];
[super dealloc];
   @end

【问题讨论】:

检查 popover 变量 - 它是 nil self.popover = [[UIPopoverController alloc] initWithContentViewController:popover];在侧面弹出窗口中,您将尝试相同的对象 【参考方案1】:

您以错误的方式初始化弹出框控制器:

self.popover = [[UIPopoverController alloc] initWithContentViewController:popover];

你应该传递你想在弹出框内显示的控制器——而不是弹出框本身(它是nil,因为你还没有初始化它)!

也许这对你有用?

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    self.popover = [[UIPopoverController alloc] initWithContentViewController:imagePicker];

如果这是正确的,那么您还应该展示您刚刚创建的弹出窗口:– presentPopoverFromRect:inView:permittedArrowDirections:animated:

--例如:

[self.popover presentPopoverFromRect:sender.frame inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

sender 是 :

的参数
- (IBAction)photoTapped1:(id)sender 

【讨论】:

谢谢,这就是我在更改代码之前获得代码的方式,当我单击编辑按钮并点击图像时,什么也没发生,并且我没有收到任何错误。跨度> 谢谢 sergio,这对我们很有帮助,现在可以正常工作了。我现在可以更改图像。 sender 参数使我的 iPhone 崩溃,所以我保留了 -(IBAction)photoTapped1 原样,没有 (id)sender。【参考方案2】:

您存储在变量popover 中的弹出框的内容 显然是nil。我看不到它是在您提供的代码中创建的。

也许您打算将食谱照片控制器显示为弹出框的内容。在这种情况下,你会做类似的事情

RecipePhotoViewController *recipePhotoViewController = [[RecipePhotoViewController alloc] init];
self.popover = [[UIPopoverController alloc] initWithContentViewController:recipePhotoViewController];

【讨论】:

谢谢大卫,我更改了它,但当我点击我的编辑按钮并点击图像时什么也没发生,我没有收到任何错误。 @Derek 好吧,你想在弹出框内展示什么? 应该是内容视图控制器。 嗨,我正在使用来自苹果的核心数据配方样本,这个项目是配方的照片,数据已经包含带有一些图像的样本配方,当我点击编辑时,我应该能够点击食谱照片并使用存储在我的手机或 iPad 图像上的另一张图像进行更改。 我已将 RecipePhotoViewController 添加到原始问题中,我假设 iPhone 和 iPad 的 imageView 处理是相同的。【参考方案3】:

问题出在这行代码中,

    self.popover = [[UIPopoverController alloc] initWithContentViewController:popover];

这样试试

    UIViewController* popoverContent = [[UIViewController alloc] init];
            UIView*   popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 400, 320, 260)];
        popoverContent.view = popoverView;
//Add what ever you want popoverView

 self.popover = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
        self.popover.delegate =self;

【讨论】:

谢谢,我已经尝试了以上所有选项,但是当我点击图像上的编辑按钮和标签时​​,什么也没有发生。 谢谢,iPhone 代码运行良好,这就是我想要复制的内容,但 iPad 除外。任何其他建议表示赞赏。

以上是关于iPad的UIPopoverController“不能用`nil`调用”错误的主要内容,如果未能解决你的问题,请参考以下文章

iPad 控件UIPopoverController使用

iPad的UIPopoverController“不能用`nil`调用”错误

iOS 11 UIWebView 下拉菜单在 iPad 上完全损坏 - UIPopoverController

全屏 iPad UIPopoverController

使IPad的UIPopoverController等于屏幕大小

如何从 iPad 上的 UIView 调用 UIPopoverController