iOS 8中Swift语言下的UIPopoverController

5
我是一个有用的助手,可以将文本翻译成中文。
我正在尝试为我的iPhone应用程序添加一个简单的popoverController,但是当我点击按钮时,经常遇到经典的“空白屏幕”问题。
我的代码如下:
@IBAction func sendTapped(sender: UIBarButtonItem) {


    var popView = PopViewController(nibName: "PopView", bundle: nil)

    var popController = UIPopoverController(contentViewController: popView)

    popController.popoverContentSize = CGSize(width: 3, height: 3)

    popController.presentPopoverFromBarButtonItem(sendTappedOutl, permittedArrowDirections: UIPopoverArrowDirection.Up, animated: true)

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle {
        // Return no adaptive presentation style, use default presentation behaviour
        return .None
    }

}

adaptivePresentationStyleForPresentationController函数只是我添加的一个东西,因为我在某个地方读到说这是需要实现以在iPhone上获取此功能。但仍然存在一张覆盖整个屏幕的空白图像,而且我不知道如何修复它。欢迎提出任何建议。
1个回答

6
我实现的解决方案基于2014年WWDC会议中介绍的一个示例《iOS 8中的视图控制器进阶》(请参见幻灯片注释)。请注意,您必须将adaptivePresentationStyleForPresentationController函数作为UIPopoverPresentationControllerDelegate的一部分来实现,但是该函数应该在您的主视图控制器中的sendTapped函数之外,并且您必须在该文件中的类声明行中指定UIPopoverPresentationControllerDelegate以确保您的代码修改了该行为。我还自行将呈现视图控制器的逻辑分离到其自己的函数中,并添加了一个检查,以确保该函数不会在当前上下文中呈现已经呈现的请求视图控制器。

因此,您的解决方案可能如下所示:

// ViewController must implement UIPopoverPresentationControllerDelegate
class TheViewController: UIViewController, UIPopoverPresentationControllerDelegate {
    // ...
    // The contents of TheViewController class
    // ...

    @IBAction func sendTapped(sender: UIBarButtonItem) {
        let popView = PopViewController(nibName: "PopView", bundle: nil)
        self.presentViewControllerAsPopover(popView, barButtonItem: sender)
    }

    func presentViewControllerAsPopover(viewController: UIViewController, barButtonItem: UIBarButtonItem) {
        if let presentedVC = self.presentedViewController {
            if presentedVC.nibName == viewController.nibName {
                // The view is already being presented
                return
            }
        }
        // Specify presentation style first (makes the popoverPresentationController property available)
        viewController.modalPresentationStyle = .Popover
        let viewPresentationController = viewController.popoverPresentationController?
        if let presentationController = viewPresentationController {
            presentationController.delegate                 = self
            presentationController.barButtonItem            = barButtonItem
            presentationController.permittedArrowDirections = .Up
        }
        viewController.preferredContentSize = CGSize(width: 30, height: 30)

        self.presentViewController(viewController, animated: true, completion: nil)
    }

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return .None
    }
}

真实世界的实现

我在一个正在进行的应用程序中,为注册表单的输入验证实现了这种方法,并将其作为扩展实现到UIViewController+Extensions.swift中。您可以在AuthViewController.swift中的验证函数中看到它的使用。presentAlertPopover方法接受一个字符串,并使用它来设置GenericAlertViewController中的UILabel的值(使得动态文本弹出框变得容易)。但是,实际的弹出框魔法都发生在presentViewControllerAsPopover方法中,该方法需要两个参数:要呈现的UIViewController实例和用作锚点的UIView对象来呈现弹出框。箭头方向被硬编码为UIPopoverArrowDirection.Up,但这并不难改变。

@CliftonLabrum 是的,事实上是这样。我会在我的回答中更新这个信息。 - Andrew Patton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接