[英]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.