【问题标题】:UIPopoverController does not dismiss when clicking on the NavigationBar点击 NavigationBar 时 UIPopoverController 不会关闭
【发布时间】:2011-09-02 11:14:07
【问题描述】:

当点击 rightBarButton 时,会出现一个 UIPopoverController。

问题是:当点击 NavigationBar 时,这个 UIPopoverController 没有关闭。

为什么?有没有办法解决它? 我试图搜索,但找不到任何关于此的内容。

提前致谢。

【问题讨论】:

    标签: iphone uipopovercontroller


    【解决方案1】:

    UIPopoverController 在出现时似乎将导航栏添加到其passthroughViews 数组中。我能够通过在显示弹出框后立即将 passthroughViews 重新设置为空数组来解决问题。

    【讨论】:

    • 完美运行!谢谢,这个问题已经以略有不同的形式被问了好几次,这是迄今为止最快和最干净的解决方案。干得好。
    • 与其用空数组设置,不如用 nil 设置。
    • 为什么会这样我不明白。
    • 在 iOS8 上你需要设置 passthroughViews 不是在呈现后就行,而是在另一个运行循环中。见this link
    【解决方案2】:

    从栏按钮启动时,您可以简单地执行此操作

    [popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    [popoverController setPassthroughViews:nil];
    

    【讨论】:

      【解决方案3】:

      导航栏上的项目将自动添加到 popoverViewController 的 passthroughViews。它发生在弹出窗口出现之后。所以你需要在那之后清除 passthroughViews 。

      而对于 iOS 8,我们可以从 UIViewController.popoverPresentationController 中获取 popoverController,在此之前,我们可以从 UIStoryboardPopoverSegue 中获取 popoverController。

      在您的视图控制器中,视图控制器显示为弹出框。

      var popoverController: UIPopoverController?
      
      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
          // Before IOS8, we need to get reference of popOverController from UIStoryboardPopoverSegue
          if (!self.respondsToSelector(Selector("popoverPresentationController"))) {
              if let popoverController = (segue as? UIStoryboardPopoverSegue)?.popoverController {
                  let menuViewController = segue.destinationViewController as AIMSMenuTableViewController
                  menuViewController.popoverController = popoverController
              }
          }
      }
      

      在显示为弹出框的视图控制器中。

      var popoverController: UIPopoverController? 
      
      override func viewDidAppear(animated: Bool) {
          super.viewDidAppear(animated)
          // Set passthroughViews to nil make tapping other navigation bar button
          // dismiss presenting popoverController
          if (self.respondsToSelector(Selector("popoverPresentationController"))) {
              self.popoverPresentationController?.passthroughViews = nil
          } else {
              // For iOS8-pre version, we need to pass popoverController reference from segue
              self.popoverController?.passthroughViews = nil
          }
      }
      

      【讨论】:

        【解决方案4】:

        documentation for UIPopoverController 声明:

        显示时,点击 弹出窗口导致弹出窗口 自动解散。为了让 用户与指定的交互 视图而不是关闭弹出窗口,你 可以将一个或多个视图分配给 passthroughViews 属性。里面的水龙头 弹出窗口不 自动导致弹出框 被解雇。你的看法和看法 控制器代码必须处理动作 和弹出框内的事件 明确地调用 dismissPopoverAnimated: 方法为 需要。

        当从条形按钮项呈现弹出框时,导航栏将添加为passthroughViews 之一。

        也许尝试将一个空数组设置为您的弹出控制器上的passthroughViews 属性。

        【讨论】:

        • 对不起,我将 passthroughViews 设置为空数组,但它不起作用。
        • 嗯,听起来导航栏可能是弹出视图控制器的父级,并且可能会添加到您设置为直通视图的任何数组中......
        【解决方案5】:

        您将此 cod 放在任何其他操作上或完成选择后或在弹出窗口中提供一些关闭按钮并完成 uy yhing,

        [popOverControllerObj dismissPopoverAnimated:YES];
        

        【讨论】:

        • 我能做到。但问题是:当我点击 NavigationBar 中的后退按钮时,将显示 parentViewController,但弹出框也在那里。我只是希望它被解雇。
        【解决方案6】:

        据我所知,这是预期的行为。 iBooks 中书架上的弹出框的行为是这样的。显示弹出框时保留对它的引用,然后在点击导航栏中的任何按钮时将其关闭。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-14
          • 1970-01-01
          • 2011-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多