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