【问题标题】:UIPopoverPresentationControllerDelegate calls on iPhoneiPhone 上的 UIPopoverPresentationControllerDelegate 调用
【发布时间】:2018-04-23 23:44:15
【问题描述】:

我正在尝试使用 Xcode(版本 9.1 9B55)Master-Detail 模板的项目,使用一个适用于 iPhone 和 iPad 的 Storyboard。

我想使用内置的弹出框 segue,理想情况下,它会在尺寸等级合适时显示弹出框,或者在尺寸等级紧凑时显示模式视图控制器(iPhone 纵向)。

我发现它在 iPad 上运行得很好,但是当我在 iPhone 上运行它时,你不能像我期望的那样触摸弹出框以外的地方来关闭它。

在 iPad 上,调用 popoverPresentationControllerDidDismissPopover 一切正常。

在 iPhone 上,popoverPresentationControllerDidDismissPopover 永远不会被调用,并且您无法关闭弹出框。

为了重现,我这样做了:

  • 创建新的主从应用程序

  • 新建 - 文件。 Cocoa Touch 类,名为 MyPopoverViewController

在故事板中:

创建新的视图控制器,将类更改为 MyPopoverViewController。

在 MasterViewController 上,添加栏按钮项“Popover”。控制并从这里拖动到 MyPopoverViewController。将 segue Kind 设置为“Present As Popover”。将标识符设置为“thePopover”。

在 MasterViewController.h 中,添加 UIPopoverPresentationControllerDelegate:

@interface MasterViewController : UITableViewController <UIPopoverPresentationControllerDelegate>

在 MasterViewController.m 中:

#import "MyPopoverViewController.h"

在 viewDidLoad 中,注释掉创建“添加按钮”的两行。

在prepareForSegue中:

} else if ([[segue identifier] isEqualToString:@"thePopover"]) {
    NSLog(@"MVC prepareForSegue thePopover");
    MyPopoverViewController *myPopoverController = segue.destinationViewController;
    myPopoverController.popoverPresentationController.delegate = self;
}

添加三个 UIPopoverPresentationControllerDelegate 委托方法:

- (void) prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController {
    NSLog(@"MVC prepareForPopoverPresentation");
}

- (void) popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController {
    NSLog(@"MVC popoverPresentationControllerDidDismissPopover");

}

- (BOOL) popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController {
    NSLog(@"MVC popoverPresentationControllerShouldDismissPopover");
    return TRUE;

}

我也试过这个,但它所做的只是在纵向模式下强制弹出(我不想要);不会改变缺少弹出框委托调用的情况,也不允许我们关闭弹出框:

 -(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationNone;
 }

我希望这里缺少一些简单的东西。我在这里上传了一个示例项目,这正是我上面描述的:

https://github.com/johnstewart/MasterDetailPopoverTestProject

如何让 iPhone 也通过触摸弹出框外部来关闭弹出框?

【问题讨论】:

  • PopOver 在弹出框外被解除。您的演示完全正常。我已经在 xcode 9.1 和 iphone 8 plus 模拟器中进行了测试。调用委托方法并成功打印其中写入的内容
  • Jitendra - 我刚刚重新下载确认。我在 iPhone 8+ 模拟器上运行了这个项目。然后旋转到横向并触摸“Popover”按钮。出现一个模态对话框而不是弹出框,在对话框外触摸不会关闭,也不会调用委托方法。

标签: ios objective-c xcode popover


【解决方案1】:

如果我正确理解您的问题,您的问题会出现在 iPhone 8 Plus 的横向模式下。

在这种情况下,呈现的弹出框实际上是不是弹出框,而是正常呈现的视图。从视觉上看,它看起来像是从屏幕底部出现的一张纸。为了关闭这样的视图,您必须添加自己的按钮来执行此操作。

如果你想显示一个真正的弹出框,你必须实现:

adaptivePresentationStyleForPresentationController:traitCollection:

返回UIModalPresentationNone。注意附加参数traitcollection:UIAdaptivePresentationControllerDelegate 包含 两个 类似的方法。在您的项目中,您已经实现了该方法:

adaptivePresentationStyleForPresentationController:

将其更改为前一种方法,一切都会正常。

【讨论】:

  • 就是这样!我已经在 MasterViewController 中实现了adaptivePresentationStyleForPresentationController:traitCollection:,并且代码按我的预期工作!我已经添加了一个测试设备是否具有紧凑或常规宽度(作为我的初衷 - 我只想要水平时的弹出框,紧凑时的模式全屏),并将该代码检查回我的测试项目以供其他人使用参考。谢谢你,米施密特!奖励赏金。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2020-04-09
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
相关资源
最近更新 更多