我知道很多次都会问同样的问题。我从堆栈溢出中读取了大部分答案并尝试过。但这对我的问题没有帮助。
我有两个视图控制器
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()。
答案 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()
}
}
因此,在设置委托后,将调用所需的方法。