触摸后关闭弹出框
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方法,弹出框弹不出