簡體   English   中英

快速調用函數不被調用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM