iPhone上的UIPopoverPresentationController不会产生弹出窗口

rat*_*p99 30 iphone objective-c popover ios

我正在尝试UIPopoverPresentationController在我的iPhone应用程序中实现新功能(使用Objective C).我想要的是一个简单的popover,其中包含一个从启动按钮发出的tableview.

- 编辑 -

这是我的修订代码,改编自文档中的研究,SO,以及下面评论中的输入:

- (IBAction)selectCategoryBtn:(UIButton *)sender
{
    [self performSegueWithIdentifier:@"CatSelectSegue" sender:self.selCatButton];
}

-(void) prepareForSegue:(UIStoryboardSegue *) segue Sender:(id) sender
{
    if (sender == self.selCatButton)
    {
        if ([segue.identifier isEqualToString:@"CatSelectSegue"])
        {
            UIPopoverPresentationController *controller = segue.destinationViewController;
            controller.delegate = self;
            controller.sourceView = self.selCatButton;
            controller.sourceRect = self.selCatButton.frame;
        }
    }
}


-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;
Run Code Online (Sandbox Code Playgroud)

这是我的故事板连接:

在此输入图像描述

然而,这只是以模态方式呈现一个桌面视图,从底部上升并消耗整个屏幕.

我用谷歌搜索了,看起来都是如此,但看起来我并不是唯一一个被我希望解决iPhone烦恼问题所迷惑的人.

任何人都可以看到我的代码中的故障或指导我一个明确的教程?我看过了,但也许API是如此新的没有人能够掌握它.

谢谢!

第二次编辑:

以下是上述代码的结果.我减少了视图控制器中的tableview的大小,我希望将其作为弹出窗口呈现.我把背景涂成灰色,只是为了澄清出现的是什么,而不是弹出窗口.

在此输入图像描述

Rob*_*Cat 73

脚步:

A)UIButton使用Present As Popoversegue类型链接到popover的视图控制器.我实际上必须创建一个新项目才能显示它,但它可能与基本SDK有关.

B)使视图控制器包含UIButton符合的<UIPopoverPresentationControllerDelegate>.例如在你的MyViewController.m文件中添加:

@interface MyViewController () <UIPopoverPresentationControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

C)将以下方法添加到包含以下内容的View Controller UIButton:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {

    return UIModalPresentationNone;
}
Run Code Online (Sandbox Code Playgroud)

D)在prepareForSegue:sender:更换segue.identifier支票时添加以下内容:

if ([segue.identifier isEqualToString:@"CatSelectSegue"]) {
    UIViewController *dvc = segue.destinationViewController;
    UIPopoverPresentationController *controller = dvc.popoverPresentationController;
    if (controller) {
        controller.delegate = self;
    }
}
Run Code Online (Sandbox Code Playgroud)

代码测试并证明其有效:

没有第三方控件的iPhone上的Popover

编辑:我的测试应用程序TPOPViewController.m文件发生了魔术:

#import "TPOPViewController.h"

@interface TPOPViewController () <UIPopoverPresentationControllerDelegate>//, UIAdaptivePresentationControllerDelegate>

@end

@implementation TPOPViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    NSString *identifier = segue.identifier;
    if ([identifier isEqualToString:@"popover"]) {
        UIViewController *dvc = segue.destinationViewController;
        UIPopoverPresentationController *ppc = dvc.popoverPresentationController;
        if (ppc) {
            if ([sender isKindOfClass:[UIButton class]]) { // Assumes the popover is being triggered by a UIButton
                ppc.sourceView = (UIButton *)sender;
                ppc.sourceRect = [(UIButton *)sender bounds];
            }
            ppc.delegate = self;
        }
    }
}

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {

    return UIModalPresentationNone;
}

@end
Run Code Online (Sandbox Code Playgroud)

我的测试故事板也是:

在iPhone测试故事板上使用Popover


小智 19

显然上述方法不再适用于iOS9/Xcode7.这是因为如果使用Interface Builder将segue样式设置为"Popover",Xcode会在编译应用程序时忽略它.此外,它会在您下次打开项目时自动将segue设置为"Push".如果您有像Git这样的版本控制软件,您将能够观察到这种不必要的变化.

但是,如果您手动显示要作为弹出框显示的视图控制器,仍然可以在iPhone上获得iPad样式的弹出式窗口.示例Swift代码:

//  ViewController.swift
//  PopoverDemo
//
//  Created by bhnascar on 12/2/15.
//  Copyright © 2015 bhnascar. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    /* The bar button item that will present the popover. */
    var popoverButton: UIBarButtonItem?

    override func viewDidLoad() {
        super.viewDidLoad()
        popoverButton = UIBarButtonItem(title: "Pop!", style: UIBarButtonItemStyle.Plain, target: self, action: "presentPopover")
        self.navigationItem.rightBarButtonItem = popoverButton
    }

    // Mark: - UIPopoverPresentationControllerDelegate

    func prepareForPopoverPresentation(popoverPresentationController: UIPopoverPresentationController) {
        popoverPresentationController.permittedArrowDirections = .any
        popoverPresentationController.barButtonItem = popoverButton
    }

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }

    // Mark: - Callback function for popover button.

    func presentPopover() {
        let popoverContentController = UIViewController()
        popoverContentController.view.backgroundColor = .blue

        // Set your popover size.
        popoverContentController.preferredContentSize = CGSize(width: 300, height: 300)

        // Set the presentation style to modal so that the above methods get called.
        popoverContentController.modalPresentationStyle = .popover

        // Set the popover presentation controller delegate so that the above methods get called.
        popoverContentController.popoverPresentationController!.delegate = self

        // Present the popover.
        self.present(popoverContentController, animated: true, completion: nil)
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 故事板使用**Present As Popover**在Xcode 9.4中适用于我. (2认同)

小智 6

SWIFT 3.X

这将在屏幕中央显示弹出框

class CommonViewController: UIViewController, UIPopoverPresentationControllerDelegate{

    func adaptivePresentationStyle(
        for controller: UIPresentationController,
        traitCollection: UITraitCollection)
        -> UIModalPresentationStyle {
            return .none
    }

    func showPopover() {
        let myViewController = UIViewController()
        myViewController.preferredContentSize = CGSize(width: 320, height: 200)
        myViewController.modalPresentationStyle = .popover

        let popOver = myViewController.popoverPresentationController
        popOver?.delegate = self

        self.present(myViewController, animated: true, completion: nil)
        popOver?.permittedArrowDirections = .up
        popOver?.sourceView = self.view

        let rect = CGRect(
            origin: CGPoint(x: self.view.frame.width/2,
                            y: self.view.frame.height/2),
            size: CGSize(width: 1, height: 1)
        )
        popOver?.sourceRect = rect
    }
}
Run Code Online (Sandbox Code Playgroud)