【问题标题】:Pass data back from a popover view controller on iPhone从 iPhone 上的弹出视图控制器传回数据
【发布时间】:2016-11-28 02:47:48
【问题描述】:

如何将数据从 PopoverViewController 传回 iPhone 上的主视图控制器?

我知道我做错了什么,但我想不通。

代码如下: PopoverViewController.swift

protocol PopoverViewControllerDelegate {
    func messageData(data: AnyObject)
}

class PopoverViewController: UIViewController {
    @IBOutlet weak var inputMessage: UITextField!
    var delegate: PopoverViewControllerDelegate?

    @IBAction func sendData(sender: AnyObject) {
        if inputMessage.text != ""{
            self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
            self.delegate?.messageData(inputMessage.text!)
        }
    }
}

主视图控制器.swift:

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate, PopoverViewControllerDelegate {

    @IBOutlet weak var showData: UILabel!

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // popover segue
        if segue.identifier == "popoverSegue" {

            let popoverViewController = segue.destinationViewController
            popoverViewController.popoverPresentationController!.delegate = self
        }
        // code to comunicate with data in popoverViewController
        let pvc = storyboard?.instantiateViewControllerWithIdentifier("popoverViewController") as! PopoverViewController
        pvc.delegate = self
        self.presentViewController(pvc, animated:false, completion:nil)
    }

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

    func messageData(data: AnyObject) {
        self.showData.text = "\(data)"
    }
}

使用上面的代码,我可以毫无问题地将数据传回主视图控制器,问题是弹出框不起作用,它就像一个常规的ViewController 占据整个屏幕。

有趣的是,如果我注释以下代码行,弹出框可以工作,但我无法再将数据传回,我可以看到弹出框,但传递的数据停止工作。

// if I comment this line 
self.presentViewController(pvc, animated:false, completion:nil)

我没有收到任何错误,只是停止工作。

有什么建议吗?

非常感谢

【问题讨论】:

    标签: ios iphone swift viewcontroller popover


    【解决方案1】:

    prepareForSegue 中,destinationViewController 是您的PopoverViewController。您需要将其转换为该值并在其上设置delegate,以便您可以传回数据,并且您还需要设置popoverPesentationController?.delegate。你不需要prepareForSegue中的其余代码:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // popover segue
        if segue.identifier == "popoverSegue" {
            let popoverViewController = segue.destinationViewController as! PopoverViewController
            popoverViewController.delegate = self
            popoverViewController.popoverPresentationController?.delegate = self
        }
    }
    

    【讨论】:

    • @vacawama - 弹出框不起作用,传递的数据有效,但弹出框视图控制器填满了整个屏幕。谢谢
    • 在 Storyboard 中连接 segue 时是否选择了 presentAsPopover
    • 你在什么设备上测试?
    • iPhone 6s 模拟器
    • 我明白了,它可以在 iPad 上运行。不幸的是,我需要它才能在 iPhone 上工作,抱歉我一开始没有澄清这一点。原始代码适用于 iPhone。
    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多