在 UIPopoverController 中显示 UIViewController

Posted

技术标签:

【中文标题】在 UIPopoverController 中显示 UIViewController【英文标题】:Displaying UIViewController inside a UIPopoverController 【发布时间】:2012-10-28 00:57:24 【问题描述】:

我正在尝试在 UIPopoverController 中显示 UIViewController。我在 Interface Builder 中设计了一个视图控制器,给它一个自定义类(比如说MyAppTestViewController),我正在尝试以这种方式创建一个弹出框:

MyAppTestViewController *fxViewController = [MyAppTestViewController new];

self.fxPopover = [[UIPopoverController alloc] initWithContentViewController:fxViewController];
self.fxPopover.popoverContentSize = CGSizeMake(1024, 120);

[self.fxPopover presentPopoverFromBarButtonItem:_fxButton permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO];

当我按下按钮时,会在正确的位置以正确的大小显示一个弹出框,但它是空的。我已经验证了MyAppTestViewControllerviewDidAppear 方法正在被调用(由NSLog),但是Popover 的内部是空的:

我错过了什么吗?

【问题讨论】:

【参考方案1】:

我看到您在评论中提到您正在使用情节提要。那么为什么不对你的MyAppTestViewController 使用popover segue 呢?您可以将 segue 直接连接到工具栏上的“效果”按钮。 (或者,或者,从您的呈现视图控制器调用 performSegueWithIdentifier:。)您可以通过将 UILabel 扔到故事板上的 MyAppTestViewController 中并查看它是否正确显示来进行快速测试。

【讨论】:

我在苦苦思索,我不知道为什么。这工作得很好。谢谢【参考方案2】:

我认为问题出在这里:

MyAppTestViewController *fxViewController = [MyAppTestViewController new];

通常您会使用[[MyViewControllerClass alloc] initWithNibName:nil bundle:nil](假设您有一个名称匹配的 xib 文件)。我不相信我见过用new 初始化的视图控制器。 Objective-C 中的一切都是 alloc-init。

苹果文档:UIViewController Class Reference

引用:

要使用 nib 初始化视图控制器对象,请使用 initWithNibName:bundle: 方法指定使用的 nib 文件 视图控制器。然后,当视图控制器需要加载它的 视图,它使用自动创建和配置视图 保存在 nib 文件中的信息。


编辑:

很吸引人,好吧。看来您对新关键字here is bit of an explanation of this 的使用是正确的。

很好,这不是问题。您是否尝试过打破viewDidAppear 方法并使用调试器打印出视图属性、检查其框架、检查其超级视图等等,试图更好地理解问题?您可能已经知道如何执行此操作,但命令将是 po self.view 等等。

无论如何,我也找到了this,尽管它只涉及弹出框呈现的机制,而不涉及内容视图分配,您似乎已经掌握了。

【讨论】:

不,我已经成功地使用new 初始化了许多视图控制器,这只是 alloc-init 的简写。我没有使用单独的笔尖,它是我故事板中的视图控制器。 你最后提供的链接真的很有用,谢谢。正如 Jay Slupesky 所回答的那样,我最终决定通过呈现一个 popover segue 来直观地实现 popover 控件。我发现视觉设计更干净,并在设计时尽量避免代码.. 无论如何感谢您的链接。

以上是关于在 UIPopoverController 中显示 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

在 UIPopOverController 中显示 Master/Detail UITableView

无法在 UIPopoverController 中显示视图控制器

如何在 iPhone 上的 UIPopoverController 中显示 NavigationController-background

想要在 UIAlertController 或 UIPopoverController Swift 中显示 UIPickerView?

ios8中iphone的UIPopoverController显示白屏

UIPopoverController backgroundColor 在显示时导致闪烁