繁体   English   中英

快速调用函数不被调用

[英]swift delegate function is not called

我知道同一问题被问过很多次。 我从堆栈溢出中读取了大多数答案并进行了尝试。 但这并没有解决我的问题。

我有两个视图控制器

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()函数。

由于我之前没有完整的代码,因此只能假定未正确假定委托。

如果委托未正确初始化,则无法将值传递给另一个viewController。

您可以通过以下方法检查委托是否正确初始化:

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

如果在控制台中打印委托为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
      }
  }

让我知道事情的后续。

一个简单的游乐场,您可以尝试做的事情,即使我不清楚您要达到的目标:

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否则您将创建参考周期
  • class应用于UpdateDataDelegate协议,否则编译器将抱怨,因为weak不能应用于类和类绑定的协议类型
  • 倾向于extension以符合协议。 它使代码易于阅读

我发现代码中唯一缺少的是对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 ,并使用ViewController1作为Initial View Controller

我假设您已经设置了代表后就需要加载数据。 在这种情况下,您可以使用魔术didSet:

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

因此,在设置委托后,将立即调用所需的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM