May*_*sam 7 uipopovercontroller swift
我的Storyboard中有两个UIViewConrollers:MainViewController和SecondViewController.当用户点击一个名为Show Popover的按钮时,我将把SecondViewController显示为一个popover:
//MainViewController
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if segue.identifier == "GoToSecondViewControllerSegue"
{
var vc = segue.destinationViewController as! SecondViewController
var controller = vc.popoverPresentationController
if controller != nil
{
controller?.delegate = self
vc.inputTextDelegate = "I'm a popover!"
}
}
}
func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
println("done")
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle
{
return .None
}
Run Code Online (Sandbox Code Playgroud)
//SecondViewController
@IBAction func dismissPopover(sender: UIButton) {
dismissViewControllerAnimated(true, completion: nil)
//This dismisses the popover but does not notify the MainViewConroller
}
Run Code Online (Sandbox Code Playgroud)
现在我有两个问题:
当我点击弹出窗口内的取消按钮时,它会解除弹出窗口但不会popoverPresentationControllerDidDismissPopover在MainViewController中触发
我如何将数据从SecondViewController传递到MainViewController,例如UITextView的文本值.
Luk*_*meo 11
或者,更简单地说,当您手动关闭弹出窗口时,只需手动调用iOS的委托方法.
dismissViewControllerAnimated(true, completion: nil)
popoverPresentationController?.delegate?.popoverPresentationControllerDidDismissPopover?(popoverPresentationController!)
Run Code Online (Sandbox Code Playgroud)
您需要将自己设置为popOverDeleagate.这是你必须在目的地的popOverPresentationController中做的.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
segue.destination.popoverPresentationController?.delegate = self
}
Run Code Online (Sandbox Code Playgroud)
然后声明在viewController中实现委托
extension FormViewController: UIPopoverPresentationControllerDelegate {
func popoverPresentationControllerDidDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) {
printBreadcrumb("Dismissed popover")
}
}
Run Code Online (Sandbox Code Playgroud)
}
议定书和代表团是解决这些问题的方法.在我的例子中,我定义了一个协议,并将MainViewController与协议相符合.
//SecondViewController
protocol MyDelegate{
func DoSomething(text:String)
}
class SecondViewController: UIViewController {
var delegate:GetTextDelegate?
var inputTextDelegate:String = ""
override func viewDidLoad() {
newText.text = inputTextDelegate
}
@IBAction func dismissPopover(sender: UIButton) {
dismissViewControllerAnimated(true, completion: nil)
//This dismisses the popover but does not notify the MainViewConroller
}
@IBAction func doneButtonAction(sender: UIButton) {
if let delegate = self.delegate {
delegate.DoSomething(newText.text)
self.dismissViewControllerAnimated(true, completion: nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
class MainViewController: UIViewController, UIPopoverPresentationControllerDelegate, MyDelegate {
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if segue.identifier == "GoToSecondViewControllerSegue"
{
var vc = segue.destinationViewController as! SecondViewController
vc.delegate = self
vc.inputTextDelegate = "I'm a popover!"
}
}
func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
//...
}
func DoSomething(text: String) {
//Do whatever you want
println(text)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14871 次 |
| 最近记录: |