一个视图中的两个 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的主要内容,如果未能解决你的问题,请参考以下文章
swift2.0中的didSelectRowAtIndexPath在一个视图控制器中的两个表视图
一个视图控制器中的两个警报视图 - buttonIndex 响应