在iPhone上从弹出视图控制器传回数据

4

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

我知道我做错了什么,但我无法弄清楚。

这是代码: 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!)
        }
    }
}

主要的ViewController.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)

我没有收到任何错误信息,只是一个停止工作了。

有什么建议吗?

非常感谢。

1个回答

2
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
    }
}

1
你在Storyboard中连线时选择了presentAsPopover吗? - vacawama
1
你正在测试哪个设备? - vacawama
iPhone 6s 模拟器 - fs_tigre
我明白了,它可以在iPad上运行。不幸的是,我需要它在iPhone上运行,很抱歉一开始没有说明清楚。原始代码可以在iPhone上运行。 - fs_tigre
这段代码适用于iPhone:`if segue.identifier == "popoverSegue" {let popoverViewController = segue.destinationViewController popoverViewController.popoverPresentationController!.delegate = self }` - fs_tigre
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接