Ios iPhone上的UIPopoverPresentationControllerDelegate调用
我正在尝试一个使用Xcode(版本9.1 9B55)主细节模板的项目,在iPhone和iPad上使用一个故事板 我想使用内置的popover segue,理想情况下,当大小类合适时,它会显示一个popover,或者当大小类紧凑时,它会显示一个模态视图控制器(iPhone的纵向) 我发现它在iPad上运行很好,但当我在iPhone上运行它时,你不能像我所期望的那样,在popover之外触摸它而忽略它 在iPad上,popoverPresentationControllerDidDismissPopover被调用,一切正常 在iPhone上,popoverPresentationControllerDidDismissPopover永远不会被调用,并且您不能关闭popover 为了复制,我做了以下工作: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
- 创建新的主细节应用程序
- 新文件。Cocoa Touch类,称为MyPopoverViewController
@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: