触摸后关闭弹出框

Posted

技术标签:

【中文标题】触摸后关闭弹出框【英文标题】:Dismiss Popover after touch 【发布时间】:2015-01-29 20:33:14 【问题描述】:

我在我的MainViewController 中创建了一个弹出框,当使用UIPopoverPresentationController 触摸某个按钮并设置它的代表时,就像它在 WWDC 2014 中显示的那样,通过以下方式:

MainViewController.swift

class MainViewController : UIViewController, UIPopoverPresentationControllerDelegate 

   @IBAction func showPopover(sender: AnyObject) 

      var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("PopOverViewController") as UIViewController

      popoverContent.modalPresentationStyle = UIModalPresentationStyle.Popover
      var popover = popoverContent.popoverPresentationController

      popoverContent.preferredContentSize = CGSizeMake(250, 419)
      popover!.delegate = self
      popover!.sourceView = self.view
      popover!.sourceRect = CGRectMake(180,85,0,0)

      self.presentViewController(popoverContent, animated: true, completion: nil)        
     

弹出框里面有一个视图,当使用点击手势识别器单击视图时,我使用模态转场显示LastViewController,模态转场是通过界面生成器创建的,而不是在代码中使用操作来呈现另一个LastViewController

一旦LastViewController 被关闭,我又回到MainViewController,弹出框仍然打开。

PopOverController里面只有默认代码而已。

LastViewController.swift

@IBAction func dismissVIew(sender: AnyObject)         
    self.dismissViewControllerAnimated(true, completion: nil)

上面的代码用于在触摸内部按钮后关闭LastViewController

故事板

一旦另一个LastViewController 可见,或者在另一个LastViewController 应该打开之前,我如何关闭弹出框?

提前致谢

【问题讨论】:

向我展示你为函数编写的代码,当用户点击弹出框时调用该函数。 @Jageen 我没有创建显示模式的动作,我使用 Interface Builder 完成了 @Jageen 我将用我使用的所有代码更新我的问题 我已经在这里回答了同样的问题***.com/questions/27481756/… 【参考方案1】:

我已经通过here回答了同样的问题。 场景不同但解决方案相同

您必须编写代码以在当前视图控制器完成时关闭呈现的视图控制器。 在LastViewController.swift的dismissVIew方法上写下代码

 var tmpController :UIViewController! = self.presentingViewController;

        self.dismissViewControllerAnimated(false, completion: ()->Void in
            println("done");
            tmpController.dismissViewControllerAnimated(false, completion: nil);
        );

下载link

【讨论】:

【参考方案2】:

在你对 FinalViewController 的按钮操作中,你尝试过吗:

@IBAction func dismissMe() 
//this should tell the popover to tell the main view controller to dismiss it.
    self.presentingViewController!.presentingViewController!.dismissViewControllerAnimated(false, completion: nil)

【讨论】:

我已经复制了您报告的问题,这绝对可以消除决赛和弹出框。【参考方案3】:

我会这样做。

我通常对 PopoverViewController 使用延迟初始化,它是 ContentViewController

lazy var popoverVC: UIPopoverController = 
    let vc = UIPopoverController(contentViewController: self.contentVC)

    vc.delegate = self

    return vc
()


lazy var contentVC: UIViewController = 
    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as UIViewController

    vc.modalInPopover = true

    return vc
()

在我的 contentViewController 中,我持有对 UIPopoverController 的引用。

var popoverVC: UIPopoverController!

然后当我显示弹出框时,我只需将 popoverController 分配给 contentViewController

@IBAction func showPopover(sender: UIButton) 
    contentVC.popoverVC = self.popoverVC

    let viewCenterRect = self.view.convertRect(self.view.bounds, toView: self.view)

    popoverVC.presentPopoverFromRect(CGRectMake(CGRectGetMidX(viewCenterRect), CGRectGetMidY(viewCenterRect), 1, 1), inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.allZeros, animated: true)

最后我以编程方式在 @IBAction 中关闭 Popover

@IBAction func dismissPopover(sender: AnyObject) 
    popoverVC.dismissPopoverAnimated(true)

【讨论】:

【参考方案4】:

在 viewcontroller 中你可以覆盖 viewWillAppear()

在这个块里面关闭它

 override public  func viewWillAppear(animated: Bool)
    
        super.viewWillAppear(animated)
        _viewToDismiss.removeFromSuperView()
    

但上面的代码假定您有对 PopOver 对象的引用,根据您对问题的描述,我认为这不是一个好的做法。

相反,为什么不让创建 PopOver 的视图控制器负责销毁它。把它放在监听按钮触摸的类中(我也假设它也会创建 PopOver)

- (void)viewWillDisappear:(BOOL)animated 

   _popOver.removeFromSuperView()

【讨论】:

我尝试了你所说的,但是在从弹出框打开的 ViewController 和带有 viewWillDisappear 的 PopOverController 中都没有发生任何事情。 贴一些代码,你的描述我看不出来 我将代码放在 MainVIewController 中调用 PopOver 的地方,我认为当它在 PopOver 中点击的 VIew 时调用的另一个 PopOverViewController 和另一个 VIewController 不相关,因为我想要的是销毁在另一个 VIewController 可见时创建的 PopOver 您可以发布您在尝试我的方法但没有成功时所做的事情吗? 有一个 .dimissPopOver() 可以在 popOverController 上调用。你试过这样称呼吗?【参考方案5】:

popover 里面有一个 View,当使用 Tap Gesture Recognizer 点击它时,我会使用模态 segue 显示另一个 ViewController。

据我了解,您应该可以通过与您的点击手势识别器关联的操作调用dismissViewControllerAnimated(_:completion:)。这将关闭您提出调用的弹出框:

self.presentViewController(popoverContent, animated: true, completion: nil)        

您可以在弹出视图控制器本身上调用此方法,具体取决于您更方便的方式:

呈现视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,它会自动将消息转发到呈现的视图控制器。

【讨论】:

查看与您在点击手势中提到的操作相关的更新问题【参考方案6】:

基于@Jageen 的回答

斯威夫特 4.2

let tmpController :UIViewController! = self.presentingViewController;

self.dismiss(animated: false, completion: ()->Void in
    print("done");
    tmpController.dismiss(animated: false, completion: nil);
);

【讨论】:

以上是关于触摸后关闭弹出框的主要内容,如果未能解决你的问题,请参考以下文章

隐藏弹出框控制器

updatepanel 里面放ASPxGridView,使用RegisterClientScriptBlock方法,弹出框弹不出

js弹出框对话框提示框弹窗总结

js弹出框对话框提示框弹窗总结

(转)js弹出框对话框提示框弹窗总结

在 iOS8 中检测弹出框关闭