没有调用swift委托函数

时间:2017-08-03 08:37:41

标签: ios 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()。

4 个答案:

答案 0 :(得分:1)

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

如果委托未正确初始化,则无法将值传递给另一个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
      }
  }

让我知道它是怎么回事。

答案 1 :(得分:0)

即使我不清楚你想要实现的目标,也是一个简单的游乐场,即使我还没有明确你想要实现的目标:

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符合协议。它使代码易于阅读

答案 2 :(得分:0)

我的代码中唯一遗漏的是调用saveData()的{​​{1}},然后调用ViewController2的{​​{1}}。

所以只需添加:

loadData()

你现在好了!)

修改

ViewController1

我使用了上面的代码,它对我来说很好。你是如何执行它的?我使用了故事板并使用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") } }

答案 3 :(得分:-4)

我假设您需要在设置委托时加载数据。在这种情况下,您可以使用magic didSet:

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

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