【问题标题】:Explain me delegation in Swift by a simple example通过一个简单的例子解释我在 Swift 中的委托
【发布时间】:2020-11-14 06:05:39
【问题描述】:

我最近在学习 Swift。我创建了不同复杂性的项目,但我仍然不明白委派的本质。在我的项目中,我尽量避免它。 我看了各种关于这个主题的视频,阅读文章,但我无法理解授权的本质。 现在我决定花一些时间来解决这个问题,并创建了一个简单的项目来解决这个问题,但我仍然无法得到它。

我想在单击按钮时从 FirstViewController 传递文本到 SecondViewController ,但是这段代码不起作用,是什么原因?我做错了什么?

protocol Protocol {
    func  fillTheLabel(with text: String)
}

class FirstViewController: UIViewController {

    var delegate: Protocol?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func buttonPressed(_ sender: Any) {
        let text = "Some Text Here"
        delegate?.fillTheLabel(with: text)
    }
}

//按钮和SecondViewController之间有一个segway

class SecondViewController: UIViewController, Protocol {
    
    var firstVC: FirstViewController?

    @IBOutlet var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        firstVC?.delegate = self
    }
    
    func fillTheLabel(with text: String) {
        label.text = text
    }
}

【问题讨论】:

  • 正如 Joakim 告诉你的那样——让一个视图控制器成为另一个视图控制器的委托可能不是使用委托模式的最佳示例。但是,如果您愿意,您可以从 Navigation Controller 堆栈中获取所需的 VC 实例(如果它存在),或者从情节提要中实例化您需要的 VC
  • 委托通常不用于在这个方向传递数据。它通常用于另一个方向,将数据从 VC2 传回 VC1。有关示例,请参见 this answer
  • 更好的方法是使用您的 Protocol 和 fillTheLabel 函数创建一个类。为 setText 创建一些公共函数,在此函数中调用“delegate?.fillTheLabel(with:text)”在 VC 上进行类的分配/初始化。将您的 VC 设置为委托。并从 VC 调用类实例上的 setText。在方法 fillTheLabel 中,您将从您的班级获得信息。这样它就可以工作了。
  • 老实说,关于方向的信息是没有用的 (vacawama)
  • 其实我知道你可以把几个VC组合在一起的方法。甚至几百万,屏幕上的像素区域都有像素,但是,通常您会看到一个 VC,实际上您最初的问题与此无关。将一个 VC 设置为另一个 VC 是一种不好的做法。在这里说话的次数很少。

标签: ios swift delegates delegation


【解决方案1】:

S0,如 cmets 所述:

– 它不起作用,因为你的 VC1 在 VC2 中是 nil

– 让一个 VC 委托另一个 VC 是不好的做法

简单的理论例子是:

您有一个类 DataParser,它从 Internet 加载一些数据,进行解析,使数据被视为您的模型,并将其保存到本地存储中。这需要时间。在所有准备工作完成后,您的 VC 应该提供这些数据。

工作完成后,DataParser 类应该通知 VC 它已经完成了数据,欢迎 VC 展示它。

当然,VC 应该通过实施来“展示”他们的兴趣:

dataParser.delegate = self

班级正在“寻找”一些对他的信息感兴趣的代表:

delegate?.dataIsReadyToBeShown(with: data)

委托(这里是VC)获取数据

func dataIsReadyToBeShown(with data: AnyClass)

【讨论】:

  • 委托其实很简单:我把为我做某事的任务委托给别人。但一开始很难掌握)。前段时间写了一篇关于委托机制的基本解释。如果这可以帮助您更好地理解,这里是链接:forums.developer.apple.com/thread/111569
  • 克劳德。您还忘记将委托属性设为 WEAK!
猜你喜欢
  • 2017-08-16
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 2011-01-12
  • 2019-02-21
  • 2018-10-11
相关资源
最近更新 更多