【问题标题】:Protocol and Delegate Help? Value isn't passing back协议和委托帮助?价值不会传回
【发布时间】:2017-05-22 22:14:20
【问题描述】:

我的EditorViewController 模态地连接到我的ModalViewController,在 ModalViewController 中,我必须在视图关闭后将一些数据传回 EditorViewController。我看过很多关于委托和协议的教程,我相信这是传递这些信息所必须做的,但我似乎无法正确地编写代码,尽管我完全按照教程进行操作。如果有人能看到这里出了什么问题,我将不胜感激。我会发布代码。

协议

protocol passColorBackDelegate {
    func colorToChange(_ color: String)
}

第一个视图控制器

class EditorViewController: UIViewController, passColorBackDelegate {

    func colorToChange(_ color: String) {
    print("Hello")
}    

第二个视图控制器文件(有数据要传回第一个的那个),里面还有另一个类,我对我的文件很吝啬

class subView: UIView {

}

class ModalViewController: UIViewController {

var delegate: passColorBackDelegate?

@IBAction func changeColor(_ sender: UIButton) {
    switch sender {
    case blueColorButton: colorToChangeTo = "Blue"
    case redColorButton: colorToChangeTo = "Red"
    case greenColorButton: colorToChangeTo = "Green"
    case purpColorButton: colorToChangeTo = "Purple"
    default: print("error")
    }
    print(colorToChangeTo)
    delegate?.colorToChange(colorToChangeTo)
    self.dismiss(animated: true, completion: nil)
}

如您所见,我的协议函数还没有包含我需要传回的任何数据,但消息仍然没有打印,这意味着函数没有被调用。如果有人能告诉我我做错了什么,我将不胜感激。谢谢

【问题讨论】:

  • 你是在segue之前设置代理吗?你需要做这样的事情:modalViewController.delegate = self.
  • 我应该把那行代码放在哪里?在 viewDidLoad()prepare(for segue) 中?在viewDidLoad() 好像不太喜欢
  • 更新:我试图把它放在prepare(for segue) 但它也给了我一个错误。就好像我的 ModalViewController 无法识别 var
  • 仅供参考,您的协议应该是 PassColorBackDelegate - 协议以大写开头,结构和类也是如此。
  • 糟糕,谢谢,我会更改它们

标签: ios swift cocoa-touch delegates protocols


【解决方案1】:

您需要在执行 segue 之前设置委托。由于听起来您正在使用 Storyboard,因此可以在 prepare(for segue) 中完成:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationVC = segue.destination as? ModalViewController {
        destinationVC.delegate = self
    }
}

此外,正如 Paul 在 cmets 中提到的,将您的协议 (PassColorBackProtocol) 和类 (SubView) 大写是 Swift 中的常规样式,可以帮助其他人理解您的代码。

【讨论】:

  • 谢谢!做到了,我也将确保利用我的课程和协议!感谢您指出这一点
猜你喜欢
  • 2019-04-05
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多