【问题标题】:Swift protocol method is not being called by the delegate委托未调用 Swift 协议方法
【发布时间】:2018-01-13 18:46:12
【问题描述】:

由于某种原因,主视图控制器中没有调用委托方法。我在这里寻找另一个答案,但没有一个对我有帮助。我在这里错过了什么吗? (为简单起见,我缩短了原始代码)

主视图控制器:

class VC: ParserDelegate {
    var dataSource = Parser()

    override func viewDidLoad() {
        super.viewDidLoad()

        dataSource.delegate = self
        dataSourse.loadAndParse()
    }

    func didReceiveDataUpdates(store: [WeatherModel]) {
        print("Delegate method triggered.")
    }

}

协议:

protocol ParserDelegate: class {
    func didReceiveDataUpdates(store: [WeatherModel])
}

我的委托类:

class Parser {
    weak var delegate: ParserDelegate?

    func loadAndParse() {
        var store = [WeatherModel]()
        // Doing something

        delegate?.didReceiveDataUpdates(store: store)
    }
}

【问题讨论】:

  • 您检查过delegate 不为空吗?
  • 不知为何是nil。但是为什么是nil我不明白。
  • 您是否设置了委托?

标签: ios swift delegation


【解决方案1】:

委托模式在这里被正确应用,但这里可能会出错:在您的主视图控制器中,您正在实例化一个新的 Parser 对象并将其存储在“dataSource”中:

var dataSource = Parser()

当您将主视图控制器设置为其委托时

dataSource.delegate = self

您的主视图控制器作为您刚刚创建的这个新实例的代理收到通知。这意味着:如果您的 Parser() 类的实例跳转到(使用调试器确保,如果确实如此)

loadAndParse()

它可能是另一个对象,所以这个解析器对象没有实际的委托。如果这是这里的问题,您可能会考虑并出口,以便能够直接与这个特定的 Parser() 类对话。希望这会有所帮助。

【讨论】:

  • 你说得完全正确,我只是注意到出于某种原因我创建了另一个Parser 类并在其上调用了loadAndParse()。感谢您指出这一点。
  • 很高兴能帮到你。
【解决方案2】:

你也可以编辑这一行:

来自:

dataSource.delegate = self
dataSourse.loadAndParse()

到:

dataSource.delegate = self
dataSource.loadAndParse()

【讨论】:

  • 为什么投反对票?用作 dataSourse.loadAndParse() 的数据源有一个小的上下文错误。
  • 这个答案应该是评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2021-03-14
相关资源
最近更新 更多