【问题标题】:How to pass data between UIViewControllers with protocols/delegates如何使用协议/委托在 UIViewControllers 之间传递数据
【发布时间】:2016-12-07 20:43:15
【问题描述】:

在下面的代码中,我有一个ViewController("SenderViewController"),当点击按钮时,它会向主ViewController 传递一条消息。我不完全理解的是主ViewController 中的messageData() 方法如何知道何时收听消息。

有人可以解释一下是什么触发了主ViewController 中的messageData() 方法吗?

SenderViewController:

import UIKit  
protocol SenderViewControllerDelegate {  
    func messageData(data: AnyObject)  
}  
class SenderViewController: UIViewController {  
    @IBOutlet weak var inputMessage: UITextField!  
     var delegate: SenderViewControllerDelegate?  

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

主视图控制器:

import UIKit  
class ViewController: UIViewController, SenderViewControllerDelegate{  
    @IBOutlet weak var showData: UILabel!  

    override func viewDidLoad() {  
        super.viewDidLoad()  
    }  

    @IBAction func goToView(sender: AnyObject) {  
        let pvc = storyboard?.instantiateViewControllerWithIdentifier("senderViewController") as! SenderViewController  
        pvc.delegate = self  
        self.presentViewController(pvc, animated:true, completion:nil)  
    }  

   // What triggers this method, how it know when to listen? 
    func messageData(data: AnyObject) {  
        self.showData.text = "\(data)"  
    }  
} 

非常感谢!

【问题讨论】:

标签: ios swift delegates protocols pass-data


【解决方案1】:

对象并不完全监听方法调用。他们坐在那里,等待被调用。

线

self.delegate?.messageData(inputMessage.text!)

来自您的SenderViewController 是一个函数调用。 (术语方法和函数几乎可以互换,虽然method 通常用于对象的函数。)它调用ViewController 中的函数messageData。

【讨论】:

    【解决方案2】:

    MainViewController 呈现SenderViewController 时,您将代理设置为self。所以每当你调用 SenderViewController 中的委托方法时

    self.delegate?.messageData(inputMessage.text!)
    

    MainViewController 的以下方法将作为回调

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

    【讨论】:

    • 非常感谢您的意见。
    【解决方案3】:

    SenderViewController:

    当您点击按钮时,您会调用sendData 方法。在此方法中,您要求delegate 调用其messageData 方法。委托属性声明为 SenderViewControllerDelegate 类型,因此您可以这样做(请参阅此协议定义)。

    ViewController(第一个视图控制器):

    在您打开第二个视图控制器之前,在方法@​​987654327@ 中,您将SenderViewController 的属性delegate 设置为“我自己”,以精确到ViewController 的实例,因为您声明它通过以下方式确认协议SenderViewControllerDelegate实现方法messageData。所以,ViewController 现在在SenderViewController 中保存为delegate 属性,可以用来调用messageData

    【讨论】:

      【解决方案4】:
      self.delegate?.messageData(inputMessage.text!)
      

      【讨论】:

        【解决方案5】:
        @IBAction func sendData(sender: AnyObject) {  
        
            if inputMessage.text != ""{  
                self.delegate?.messageData(inputMessage.text!)  
                self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)  
        
            }else{
               //handle here
        }
        

        注意:如果您需要向 mainViewController 传递多个数据,请使用字典来传递它们。即

        SenderViewController:

        import UIKit  
        protocol SenderViewControllerDelegate {  
            func messageData(data: [String : Any])  
        }  
        class SenderViewController: UIViewController {  
            @IBOutlet weak var inputMessage: UITextField!  
            var delegate: SenderViewControllerDelegate?  
        
            @IBAction func sendData(sender: AnyObject) {  
        
                let myDict = [ "name": "Name", "age": 21, "email": "test@gmail.com"] as! [String : Any]
        
                self.delegate?.messageData(myDict) 
                self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)  
        
        
          }  
        }  
        

        主视图控制器

        import UIKit  
        class ViewController: UIViewController, SenderViewControllerDelegate{  
            @IBOutlet weak var showData: UILabel!  
        
            override func viewDidLoad() {  
                super.viewDidLoad()  
            }  
        
            @IBAction func goToView(sender: AnyObject) {  
                let pvc = storyboard?.instantiateViewControllerWithIdentifier("senderViewController") as! SenderViewController  
                pvc.delegate = self  
                self.presentViewController(pvc, animated:true, completion:nil)  
            }  
        
           // What triggers this method, how it know when to listen? 
            func messageData(data: [String : Any]) {  
                print(data["name"])  
                print(data["age"])  
                print(data["email"])  
        
            }  
        } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 2015-10-18
          • 1970-01-01
          相关资源
          最近更新 更多