使用自适应 segue 时如何获取对 UIPopoverController 的引用?

Posted

技术标签:

【中文标题】使用自适应 segue 时如何获取对 UIPopoverController 的引用?【英文标题】:How to get reference to UIPopoverController when using adaptive segue? 【发布时间】:2014-07-27 03:35:13 【问题描述】:

在我的 ios 7 应用程序中,我通过 prepareForSegue 中的此检查检测到 segue 是否为弹出框:

if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]])

但现在我使用了自适应转场,Present as Popover 转场在上述检查中不再返回 true。这是因为 segue 不再是 UIStoryboardPopoverSegue,而是 UIStoryboardPopoverPresentationSegue。但是,不能简单地添加 Presentation 这个词,因为它没有被定义。

检测转场何时是自适应转场的弹出框而不是全屏模式演示的适当方法是什么?

还有,如何获得对 iOS 8 弹出框的引用?以下是我为 iOS 7 所做的,但同样因为它不是 UIStoryboardPopoverSegue 这会导致崩溃。

UIPopoverController *popover = ((UIStoryboardPopoverSegue *)segue).popoverController;
popover.popoverContentSize = CGSizeMake(380, 1000);

【问题讨论】:

【参考方案1】:

实际上没有必要获得对 iOS 8 弹出框的引用。您可以直接在显示的视图控制器中访问 popoverPresentationController。然后使用dismissViewControllerAnimated 关闭视图控制器。您可以直接在通过preferredContentSize 呈现的视图控制器中设置弹出框内容大小。我发现我不需要在 prepareForSegue 中获得参考,至少在 iOS 8 上运行时是这样。iOS 7 是另一回事。

【讨论】:

有趣的是,Apple 似乎在 iOS8 中提供了 UIPopoverController 实例,就像它们在 iOS7 中一样,我想是为了向后兼容。因此,在 iOS7 中运行的相同代码应该在 iOS8 中运行,但有一个区别:在 iOS8 中,如果您不将 UIPopoverController 存储为强引用,则它会很快被释放。在 iOS7 中,对 UIPopoverController 的弱引用就足够了,因为只要它显示,iOS 就会持有它。【参考方案2】:

详细阐述 Joey 的回答,这让我想到了实现我们过去使用 UIPopoverController 所做的新方法。

此代码在prepareForSegue:Sender:

        UIViewController *destination = segue.destinationViewController;
        UIPopoverPresentationController *ppc = destination.popoverPresentationController;
        ppc.delegate = self;

是一种将视图控制器成功设置为 UIPopoverPresentationController 的委托的简单方法,这与您可能习惯于使用旧的 UIPopoverController 的方法非常相似。

当然,当您使用它时,您可能会添加:

[destination setPreferredContentSize:CGSizeMake(300.00f, 300.00f)];

如果您也习惯在此处设置 UIPopoverController 大小。

【讨论】:

不知道这个sn-p是否兼容ios 7? 我的猜测是没有。我很快就退出了旧操作系统,所以我无法轻易确认。 谢谢。我很早就确认了,7 或更早的时候不工作。【参考方案3】:

这可能不是最简单的方法,但您可以检查目标视图控制器上的 popoverPresentationController 属性。从那里您可以配置弹出框锚等。

检查 UIPopoverPresentationController 文档的“配置弹出框以显示”部分。 (不确定我们现在是否可以链接到它们,是吗?)

还要注意,现在我们谈论的是 UIPopover*Presentation*Controllers,而不是 UIPopoverControllers。有点混乱……

【讨论】:

这不起作用。这在 iPhone(模态)和 iPad(弹出框)上返回 true:if ([[segue destinationViewController] popoverPresentationController] != nil)

以上是关于使用自适应 segue 时如何获取对 UIPopoverController 的引用?的主要内容,如果未能解决你的问题,请参考以下文章

从自定义导航栏展开 segue 后,如何切换回默认导航栏外观?

如何使用自适应卡操作从自适应卡获取用户响应。使用 Microsoft Bot Framework 从 MS Teams 频道提交操作?

ethtool命令如何实现对Intel的千兆交换网卡禁用自适应

iOS如何获取对带有segue的storyboard容器中嵌入的视图控制器的引用?

当原型单元不工作时如何使用segue

如何使用自定义 UITableViewCell 进行 Segue?将数据传递到详细视图控制器的问题