swift委托函数不被调用

我知道同样的问题被问了很多次。 我读了堆栈溢出的大部分答案,并尝试。 但是这并没有帮助我的问题。

我有两个视图控制器

protocol UpdateDataDelegate { func loadData() } viewcontroller2 { var delegate: UpdateDataDelegate? override func viewDidLoad() { super.viewDidLoad() } fun saveData() { self.delegate?.loadData() } } viewcontroller1 : UpdateDataDelegate { var vc2 = viewcontroller2() override func viewDidLoad() { super.viewDidLoad() vc2.delegate = self } func loadData() { } } 

但是来自viewcontroller1的函数loadData()不会被调用。

一个简单的游乐场,即使我不清楚你想要做什么,

 import UIKit protocol UpdateDataDelegate: class { func loadData() } class ViewController2: UIViewController { weak var delegate: UpdateDataDelegate? func saveData() { self.delegate?.loadData() } } class ViewController1: UIViewController { } extension ViewController1: UpdateDataDelegate { func loadData() { print("loadData called") } } let viewController1 = ViewController1() let viewController2 = ViewController2() viewController2.delegate = viewController1 viewController2.saveData() 

几个注意事项:

  • 类应该是大写的。 所以, ViewController1改为viewcontroller1
  • 代表应该是weak否则你创build参考周期
  • class应该用于UpdateDataDelegate协议,否则编译器会抱怨,因为weak不能应用于类和类绑定的协议types
  • 更喜欢extension符合协议。 它使代码易于阅读

由于我之前没有完整的代码,所以我只能假设委托没有被正确地假设。

如果委托没有正确初始化,它不能将值传递给另一个viewController。

你可以检查委托是否被正确初始化:

 if let delegate = delegate{ //Do your works here }else{ print("The delegate is nil") } 

如果委托是无名打印在控制台,那么问题可能是委托初始化的方式

这可能是因为你正在设置委托并打开未分配委托值的viewController的另一个实例。

在你提供的代码中,我看到你正在设置委托

 var vc2 = viewcontroller2() vc2.delegate = self 

但是我看不到你用来移动到viewController2的代码。 现在我们必须展示这个分配的viewController。 而不是使用segue移动到viewcontroller2使用下面的代码呈现此vc

  present(vc2, animated: true, completion: nil) 

你应该根据你的代码逻辑放置它(你的segue被触发的地方)

情况2:

如果你正在使用segue移动到viewController2那么委托应该在prepareforSegue方法中分配如下

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc2 = segue.destination as? ViewController2{ vc2.delegate = self } } 

让我知道事情的后续。

我在代码中看到的唯一的东西是调用ViewController2 saveData() ,它将依次调用ViewController1 loadData()

所以只需添加:

 override func viewDidLoad() { super.viewDidLoad() vc2.delegate = self vc2.saveData() //Add this line to your code } 

你现在很好走:)

编辑:

 protocol UpdateDataDelegate { func loadData() } class ViewController2: UIViewController { var delegate: UpdateDataDelegate? func saveData() { self.delegate?.loadData() } } class ViewController1: UIViewController, UpdateDataDelegate { var vc2 = ViewController2() override func viewDidLoad() { super.viewDidLoad() vc2.delegate = self vc2.saveData() } func loadData() { print("Done") } } 

我已经使用了上面的代码,它对我来说工作得很好。 你怎么执行它? 我已经使用故事板,并使用ViewController1作为Initial View Controller

我假设你需要加载数据,当你的代表已经设置。 在这种情况下,你可以使用魔法didSet:

 weak var delegate: UpdateDataDelegate? { didSet { self.saveData() } } 

所以在设置委托后,所需的方法将被调用。