ios - 如何在不使用 segues 的情况下使用委托(delegate)和协议(protocol)将数据从以编程方式创建的 UIPopoverController 传递到 ViewController?

标签 ios swift delegates protocols uipopovercontroller

我遇到了一个我无法解决的问题。问题是我以编程方式创建了从 FirstViewController 调用的 UIPopoverController,如下所示。

@IBAction func addButton(sender: UIButton) {

            let popoverRect = CGRectMake(-360.0, 170.0, 515.0, 415.0)
            var popView = AddCustomerPopoverVC (nibName :"AddCustomerPopoverVC" , bundle : nil)
            var popController = UIPopoverController (contentViewController: popView)
            popController.delegate = self
            popController.popoverContentSize = CGSize(width: 515.0 , height: 415.0)
            popController.presentPopoverFromRect(popoverRect , inView: self.view , permittedArrowDirections: UIPopoverArrowDirection.allZeros, animated: true)
 }

并在 FirstViewController 中传递 Customer 委托(delegate)方法定义;

    func passCustomer(customer: Customer) {

        self.profilePhoto.image = UIImage(named: "circleBlue.png") as UIImage?
        self.usernameLabel.text = customer.name
        self.eMailLabel.text = customer.eMail
}

和如下所示的 AddCustomerPopoverVC ;

    import UIKit
    import Foundation

    protocol PassValues {

        func  passCustomer(customer : Customer )

    }


    class AddCustomerPopoverVC: UIViewController  {

        var delegate : PassValues? = nil
        @IBOutlet weak var navBar: UINavigationBar!
        @IBOutlet weak var nameTextField: UITextField!
        @IBOutlet weak var surnameTextField: UITextField!
        @IBOutlet weak var eMailTextField: UITextField!
        @IBOutlet weak var phoneTextField: UITextField!
        @IBOutlet weak var advSwitchOutlet: UISwitch!
        @IBOutlet weak var taxFreeSwitchOutlet: UISwitch!

        @IBAction func saveButton(sender: UIBarButtonItem) {

            var cName = "\(self.nameTextField.text) \(self.surnameTextField.text)"
            var cEmail = self.eMailTextField.text
            var cPhone = self.phoneTextField.text
            var cAdDelivery = self.advSwitchOutlet.on ? true : false
            var cTaxFree = self.taxFreeSwitchOutlet.on ? true : false

            let customer : Customer = Customer(name: cName, eMail: cEmail, phone: cPhone, adDelivery: cAdDelivery, taxFree: cTaxFree)

delegate!.passCustomer(customer)

        }



        override func viewDidLoad() {
            super.viewDidLoad()

            // Do any additional setup after loading the view.
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }

    }

当我点击我的保存按钮时,它什么也没做。我的意思是它做某事。但它对传递值过程没有任何作用。我应该怎么做才能完成这个过程。我做错了什么或错过了什么?

我已经检查了下面的链接,但我不能说我已经清楚了.. Trying to understand protocol/delegates in Swift

最佳答案

我很确定您需要分配 popViewdelegate 而不是 popController:

@IBAction func addButton(sender: UIButton) {
        let popoverRect = CGRectMake(-360.0, 170.0, 515.0, 415.0)
        var popView = AddCustomerPopoverVC (nibName :"AddCustomerPopoverVC" , bundle : nil)
        popView.delegate = self
        var popController = UIPopoverController (contentViewController: popView)
        popController.delegate = self
        popController.popoverContentSize = CGSize(width: 515.0 , height: 415.0)
        popController.presentPopoverFromRect(popoverRect , inView: self.view , permittedArrowDirections: UIPopoverArrowDirection.allZeros, animated: true)
 }

此外,调用像这样的可选委托(delegate)方法也是一个很好的做法(注意问号而不是感叹号):

delegate?.passCustomer(customer)

因此,如果委托(delegate)为 nil,应用程序将不会崩溃。如果您完全确定 delegate 永远不会为零,那么您最好将其声明为 var delegate : PassValues!

关于ios - 如何在不使用 segues 的情况下使用委托(delegate)和协议(protocol)将数据从以编程方式创建的 UIPopoverController 传递到 ViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32459108/

相关文章:

ios - 使用 Swift 3 将数据从 Modal Viewcontroller 传递到 rootController(不要 Segue)

ios - 如何在折线图中显示第一个值和最后一个值

ios - Delegate vs Unwind Segue 将数据传递给父场景

ios - UIimage 没有被服务器 xcode 完全接收

ios - IAP 可用性延迟

ios - UIAlertController 中的文本字段不应该是第一响应者

java - 如何在 lucene 4.x 中正确实现委托(delegate)分词器?

ios - 从 NSOrderedSet 和核心数据中删除一个项目

ios - 立即使用 UNUserNotificationCenter 调用本地通知

c++ - 5 年后,还有比 "Fastest Possible C++ Delegates"更好的东西吗?