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() } }
所以在设置委托后,所需的方法将被调用。