一个视图中的两个 UIPoovers

Posted

技术标签:

【中文标题】一个视图中的两个 UIPoovers【英文标题】:Two UIPopovers in One View 【发布时间】:2011-09-09 18:54:37 【问题描述】:

我试图将两个不同的 UIPopovers 放在一个视图中。我对objective-c和一般编程相当陌生,所以我没有采用智能、有效的方法来创建一个popover并根据它的调用方式更改它的内容,我只是使用了愚蠢、简单的方法来创建两个视图、两个代表、两个弹出框等...我不知道这是否是我遇到问题的原因,还是出于其他原因。

所以这就是问题所在。在弹出窗口出现的视图的viewdidload 中,我有以下代码:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

    optionsViewController =[[OptionsViewController alloc]init];
    optionsViewController.delegate = self;
    popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
    popoverController.popoverContentSize = CGSizeMake(320, 216);
    [popoverController setDelegate:self];

    newCurrencyViewController =[[newCurrencyViewController alloc]init];
    newCurrencyViewController.delegate = self;
    newCurrencyPopoverController = [[UIPopoverController alloc] initWithContentViewController:newCurrencyViewController];
    newCurrencyPopoverController.popoverContentSize = CGSizeMake(320, 216);
    [newCurrencyPopoverController setDelegate:self];



显然optionsViewController 是出现在popover 1 内的vc(带有名为“popoverController”的popover 控制器),而newCurrencyViewController 是出现在popover 2 内的vc(带有名为“newCurrencyPopoverController”的popover 控制器)。

每次加载视图时,应用程序都会崩溃并出现SIGABRT 错误,并且控制台会显示:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIPopoverController initWithContentViewController:] must not be called with `nil`.'

另外,还有一条警告说“找不到实例方法 -alloc(返回类型默认为 id)”

saysnewCurrencyViewController =[[newCurrencyViewController alloc]init];

我的第一个想法是我在某处拼错了文件名,因为我认为问题在于它没有找到名为 newCurrencyPopoverController 的文件,但我检查了所有内容,但找不到任何拼写错误或任何东西.有什么想法吗?

非常感谢!

卢克

【问题讨论】:

【参考方案1】:

您正在调用变量newCurrencyViewController 的方法alloc + init,但您应该将它们调用到该变量的类!

与错误一致:

newCurrencyViewController =[[newCurrencyViewController alloc]init];

这一行的结果将是newCurrencyViewController == nil。当您尝试使用该视图初始化 UIPopoverController 时,它会像您描述的那样崩溃。

如果变量newCurrencyViewController 属于类,例如CurrencyViewController,那么您应该用这一行替换该行:

newCurrencyViewController =[[CurrencyViewController alloc] init];

【讨论】:

很好地解释了错误。为此 +1。【参考方案2】:

当您调用 newCurrenceViewController 时,您没有对象可以调用 alloc 和 init。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

    optionsViewController =[[OptionsViewController alloc]init];
    optionsViewController.delegate = self;
    popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
    popoverController.popoverContentSize = CGSizeMake(320, 216);
    [popoverController setDelegate:self];

    //Here is your problem---------------------------------------------
    newCurrencyViewController =[[newCurrencyViewController alloc]init];
    //-----------------------------------------------------------------

    newCurrencyViewController.delegate = self;
    newCurrencyPopoverController = [[UIPopoverController alloc] initWithContentViewController:newCurrencyViewController];
    newCurrencyPopoverController.popoverContentSize = CGSizeMake(320, 216);
    [newCurrencyPopoverController setDelegate:self];



你可能想要更像

newCurrencyViewController = [[UICurrencyViewController alloc] init];

或者 w/e 您的自定义视图控制器的名称是

【讨论】:

非常感谢。只给了你上面的那个人,因为他是第一个,但无论如何谢谢。 +1 @Nekto:嗯,当我发布我的帖子时,你的帖子远没有用。你在我发帖时编辑了它,你甚至得到了接受的答案。不知道你在抱怨什么。 也许你应该在写“你的不正确”之前阅读我发布的整个帖子。 UICurrencyViewController 是原始海报实际需要的类的占位符。它相当于您的 CurrencyViewController。我的帖子解释了这一点。

以上是关于一个视图中的两个 UIPoovers的主要内容,如果未能解决你的问题,请参考以下文章

一个视图控制器中的两个表视图,快速

如何将 xib 加载到一个视图控制器中的两个容器视图中

swift2.0中的didSelectRowAtIndexPath在一个视图控制器中的两个表视图

一个视图控制器中的两个警报视图 - buttonIndex 响应

将两个 xib 文件中的两个 tableviews 添加到主 xib 视图

一个 UIViewController 中的两个 UICollectionView