2017-08-03 87 views
0

我知道同样的问题被问了很多次。我阅读了堆栈溢出的大部分答案,并尝试过。但它没有帮助我的问题。斯威夫特代表功能不叫

我有两个视图控制器

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

您正在创建新的实例wth var vc2 = viewcontroller2(),这就是为什么它没有调用。你可以检查在viewcontroller2上使用print self并打印vc2变量 –

+4

你需要粘贴更多的代码。这段代码太抽象了,不可能找出问题所在。例如,你永远不会调用'saveData',所以难怪委托函数没有被调用。如果出现语法错误,它甚至不会编译。 –

+0

我想用viewcontroller2中的新数据集更新我的viewcontroller1。所以我打电话给代表。 – swiftuser123

回答

-4

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

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

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

+0

我想用viewcontroller2中的新数据集更新我的viewcontroller1。所以我打电话给代表。我会尝试你的代码。 – swiftuser123

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

由于我没有完整的代码在我面前,我只能假定委托没有被正确假设。

如果委托未正确初始化,则无法将值传递给其他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的下面介绍

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

使用这个代码VC应该这个根据你的代码逻辑的地方。(您赛格瑞被触发)

情况2:

如果使用SEGUE移动到viewController2然后委托应在prepareforSegue方法分配如下

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

让我知道它如何去。

0

我在代码中看到的唯一遗漏是呼叫saveData()ViewController2,这将依次调用ViewController1loadData()

所以只需添加:

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

+0

它没有为我工作 – swiftuser123

+0

我编辑了我的答案。检查它是否有效。 – PGDev