菜鸟教程小白 发表于 2022-12-13 03:15:51

ios - iPhone 上的 UIPopoverPresentationControllerDelegate 调用


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

<p>我想使用内置的 popover segue,理想情况下,它会在尺寸等级合适时显示弹出框,或者在尺寸等级紧凑时显示模态视图 Controller (iPhone 纵向)。</p>

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

<p>在 iPad 上,调用 popoverPresentationControllerDidDismissPopover 一切正常。</p>

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

<p>为了重现,我这样做了:</p>

<ul>
<li><p>创建新的主从应用程序</p></li>
<li><p>新建 - 文件。 Cocoa Touch 类,名为 MyPopoverViewController</p></li>
</ul>

<p>在 Storyboard中:</p>

<p>创建新的 ViewController ,将类更改为 MyPopoverViewController。</p>

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

<p>在 MasterViewController.h 中,添加 UIPopoverPresentationControllerDelegate:</p>

<pre><code>@interface MasterViewController : UITableViewController &lt;UIPopoverPresentationControllerDelegate&gt;
</code></pre>

<p>在 MasterViewController.m 中:</p>

<pre><code>#import &#34;MyPopoverViewController.h&#34;
</code></pre>

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

<p>在prepareForSegue中:</p>

<pre><code>} else if ([ isEqualToString:@&#34;thePopover&#34;]) {
    NSLog(@&#34;MVC prepareForSegue thePopover&#34;);
    MyPopoverViewController *myPopoverController = segue.destinationViewController;
    myPopoverController.popoverPresentationController.delegate = self;
}
</code></pre>

<p>添加三个 UIPopoverPresentationControllerDelegate 委托(delegate)方法:</p>

<pre><code>- (void) prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController {
    NSLog(@&#34;MVC prepareForPopoverPresentation&#34;);
}

- (void) popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController {
    NSLog(@&#34;MVC popoverPresentationControllerDidDismissPopover&#34;);

}

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

}
</code></pre>

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

<pre><code> -(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationNone;
}
</code></pre>

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

<p> <a href="https://github.com/johnstewart/MasterDetailPopoverTestProject" rel="noreferrer noopener nofollow">https://github.com/johnstewart/MasterDetailPopoverTestProject</a> </p>

<p>如何让 iPhone 也通过触摸弹出框外部来关闭弹出框?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果我正确理解您的问题,您的问题会出现在 iPhone 8 Plus 的横向模式下。</p>

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

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

<pre><code>adaptivePresentationStyleForPresentationController:traitCollection:
</code></pre>

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

<pre><code>adaptivePresentationStyleForPresentationController:
</code></pre>

<p>将其更改为前一种方法,一切都会正常。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - iPhone 上的 UIPopoverPresentationControllerDelegate 调用,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47227970/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47227970/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - iPhone 上的 UIPopoverPresentationControllerDelegate 调用