Ios iPhone上的UIPopoverPresentationControllerDelegate调用

Ios iPhone上的UIPopoverPresentationControllerDelegate调用,ios,objective-c,xcode,popover,Ios,Objective C,Xcode,Popover,我正在尝试一个使用Xcode(版本9.1 9B55)主细节模板的项目,在iPhone和iPad上使用一个故事板 我想使用内置的popover segue,理想情况下,当大小类合适时,它会显示一个popover,或者当大小类紧凑时,它会显示一个模态视图控制器(iPhone的纵向) 我发现它在iPad上运行很好,但当我在iPhone上运行它时,你不能像我所期望的那样,在popover之外触摸它而忽略它 在iPad上,popoverPresentationControllerDidDismissPop

我正在尝试一个使用Xcode(版本9.1 9B55)主细节模板的项目,在iPhone和iPad上使用一个故事板

我想使用内置的popover segue,理想情况下,当大小类合适时,它会显示一个popover,或者当大小类紧凑时,它会显示一个模态视图控制器(iPhone的纵向)

我发现它在iPad上运行很好,但当我在iPhone上运行它时,你不能像我所期望的那样,在popover之外触摸它而忽略它

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

在iPhone上,popoverPresentationControllerDidDismissPopover永远不会被调用,并且您不能关闭popover

为了复制,我做了以下工作:

  • 创建新的主细节应用程序

  • 新文件。Cocoa Touch类,称为MyPopoverViewController

在故事板中:

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

在MasterViewController上,添加栏按钮项“Popover”。控件从该控件拖动到MyPopoverViewController。将segue Kind设置为“显示为Popover”。将标识符设置为“thepover”

在MasterViewController.h中,添加UIPopoverPresentationControllerDelegate:

@interface MasterViewController : UITableViewController <UIPopoverPresentationControllerDelegate>
在viewDidLoad中,注释掉创建“添加按钮”的两行

在准备阶段:

} 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;

}
我也尝试过,但它所做的只是在肖像模式下强制弹出(我不想要);不改变缺少popover代理调用的情况,也不允许我们取消popover:

 -(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationNone;
 }
我希望这里有一些简单的东西我遗漏了。我在这里上传了一个示例项目,这正是我上面描述的:


如何允许iPhone通过触摸popover外部来关闭popover?

如果我正确理解您的问题,您的问题将以横向模式出现在iPhone 8 Plus上

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

如果要显示真实的popover,必须实现:

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

adaptivePresentationStyleForPresentationController:

将此更改为前一种方法,所有操作都会正常进行。

PopOver在PopOver之外会被禁用。您的演示完全正常。我已经在xcode 9.1和iPhone8 plus模拟器中进行了测试。委托方法被调用,并成功地打印出用itJitendra编写的内容——我只是重新下载以确认。我在iPhone8+模拟器上运行了这个项目。然后旋转到横向并触摸“Popover”按钮。此时会出现一个模式对话框而不是弹出窗口,触摸对话框外部不会关闭,也不会调用委托方法。就是这样!我已经在MasterViewController中实现了adaptivePresentationStyleForPresentationController:traitCollection:,代码按照我的预期工作!我已经添加了一个测试,测试设备是否具有紧凑的或规则的宽度(正如我的初衷——我只希望在水平方向上有一个popover,紧凑时有一个模式全屏),并将该代码检查回我的测试项目中,以供其他人参考。谢谢你,mschmidt!赏金。
adaptivePresentationStyleForPresentationController: