iOS 8:在弹出框内显示时禁用UIBarButtonItem

时间:2014-09-12 09:23:57

标签: ipad swift ios8 xcode6 uipopover

现在XCode 6和iOS 8启用了大小类,所有设备只有一个故事板。精细。 但与此同时,Apple建议避免使用条形按钮项来消除弹出窗口。 现在,如何在iPhone上展示UIBarButtonItem,而不是在iPad上的popover中展示

精确:我知道如何根据设备是iPad来禁用UIBarButtonItem。我正在寻找一种专门检测弹出窗口的方法。

编辑:这段代码有效,但我喜欢不依赖于设备的东西:

if traitCollection.userInterfaceIdiom == .Pad {
        navigationItem.rightBarButtonItem = nil
    }
编辑:我创建了一个小型Github项目,以明确我的问题: Github - Test Popover

谢谢!

2 个答案:

答案 0 :(得分:1)

你现在可能已经解决了这个问题,但我发现这有效:

if (self.popoverPresentationController.presentingViewController.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) {
    // hide bar button item
} else {
    // show bar button item
}

答案 1 :(得分:1)

我终于找到了解决这个问题的方法:

  • 在故事板中,我删除了"关闭"视图控制器导航栏中的栏按钮项目我希望在iPad上显示为popover,在iPhone上显示为模式VC。所以现在这个控制器嵌入在导航控制器中,但没有"关闭"按钮。 enter image description here
  • 调用者视图控制器(具有调用弹出框的条形按钮项的控制器)中,我在prepareForSegue中添加了以下代码(顺便提一下,我的segue是一个Popover segue)< / LI>

PrepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

// switch on the segue.identifier
// ....
       case .DisplayPreferences:
           print("Segue to Preferences")
           if let popoverPresentationController = segue.destinationViewController.popoverPresentationController {
             popoverPresentationController.delegate = self
           }
// ....
}
  • 我添加了以下扩展名,以便调用者视图控制器符合UIPopoverPresentationControllerDelegate协议

UIPopoverPresentationControllerDelegate:

// MARK: - UIPopoverPresentationController Delegate methods
extension StockListTableViewController: UIPopoverPresentationControllerDelegate {

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


func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
    if let navigationVC = controller.presentedViewController as? UINavigationController,
        let preferencesVC = navigationVC.visibleViewController as? PreferencesTableViewController {
        // This Bool indicates whether the popover controller should display the bar button item or not
        preferencesVC.shouldShowCloseButton = true
    }
    return controller.presentedViewController
}

}

  • 最后,在名为的视图控制器(在iPad上是popover但在iPhone上是模态)中,我添加了以下代码:

属性:

    var shouldShowCloseButton = false

viewDidLoad中:

override func viewDidLoad() {
    super.viewDidLoad()

    // Close button
    if shouldShowCloseButton {
        let closeButton = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: #selector(PreferencesTableViewController.doneButtonTapped(_:)))
        navigationItem.setRightBarButtonItem(closeButton, animated: true)
    }
}

doneButtonTapped:

func doneButtonTapped(sender: UIBarButtonItem) {
    navigationController?.dismissViewControllerAnimated(true, completion: nil)
}

对我而言,这完美无缺:

  • 在iPhone上,我得到了一个以模态方式呈现的视图控制器,其中包含&#34;关闭&#34; 导航控制器中的按钮项,允许我将其关闭

  • 在iPad上
  • ,我得到一个没有&#34;关闭&#34;按钮因为有一个popover th预期的行为是在popover外面点击 解雇它。