我们为什么需要代表的确切原因/

时间:2016-01-14 05:54:03

标签: ios objective-c swift delegates

以ObjC / SWIFT或任何其他编码语言代表一个重要概念。我知道委托用于将消息从一个类传递到另一个类,特别是当我们想要将消息传递回我们刚刚移动到其他视图控制器的视图控制器时。

我正在寻找更多的技术答案,并对此进行了大量搜索,这就是我得到的确切答案 -

  

根据MVC的规则,我们需要一种方法来返回一个值。在哪里   调用实例我们可以回到调用它的类吗?与   封装类我们不能。无法发送修改后的内容   模型回原始控制器而不破坏封装   或MVC。新的视图控制器对该类一无所知   这叫它。我们看起来很困难如果我们试图直接参考   对于调用控制器,我们可能会引发一个参考循环   杀了我们的记忆。简单地说,我们不能向后发送东西。

但是解释说了一些关于

的事情
  

在哪里    调用实例我们可以回到调用它的类吗?与   封装类我们不能。无法发送修改后的内容   模型回原始控制器而不破坏封装   或MVC。

这段命中究竟是什么意思。任何人都可以用更简单的方式解释这一点,并将以下代码作为参考 -

VC2 -

import UIKit
protocol myDelegate : class
{
    func sendItems(name:NSString)
}
class EnterViewController: UIViewController
{
     weak var delegate: myDelegate?

    @IBOutlet weak var nameTextfield: UITextField!
    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.
    }

    @IBAction func sendData(sender: AnyObject)
    {

         delegate?.sendItems(nameTextfield.text!)
        self.navigationController?.popViewControllerAnimated(true)
    }

VC2

import UIKit

class DisplayViewController: UIViewController,myDelegate
{

    @IBOutlet weak var nameLabel: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func sendItems(name: NSString) {
        self.nameLabel.text = name as String
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {
        let destinationVC = segue.destinationViewController as! EnterViewController
        if segue.identifier == "enterDetail"
        {
         destinationVC.delegate = self
        }

    }
}

感谢。

1 个答案:

答案 0 :(得分:0)

简单来说,Delegate是Class的代表,它代表类。如果我们在现实世界中进行比较,那么外国代表将代表他们的政府并拥有所有控制权和权力。类似地,这里代理具有类的对象将具有的所有控件并且代表Class。

现在委托具体是由类指定的对象来通知事件。 NSNotification也可以实现这一点。但差异是Delegates可以拦截事件,但NSNotification不能。

在您的代码中:

  1. 您已将 DestinationVC的委托指定给 DisplayViewController
  2. 现在 DisplayviewController 会通知您要通知Class DestinationVC 的所有事件,并在事件之间拦截。
  3. 在您的情况下,您正在呼叫 DestinationVC sendItems
  4. 我很抱歉我的错误解释,但我想你会得到基本的想法。