Swift 使用委托时不会发生任何事情

Swift 使用委托时不会发生任何事情,swift,delegates,Swift,Delegates,我试图使用委托(用于测试)将文本输出到viewDidLoad,但什么也没有发生 protocol LoaderDelegate: class { func LoadData(_ controller: SearchPhotosViewController) } class LoaderData: LoaderDelegate { func LoadData() { print("Hello from LoaderData") } } class SearchPhotosV

我试图使用委托(用于测试)将文本输出到viewDidLoad,但什么也没有发生

protocol LoaderDelegate: class {
  func LoadData(_ controller: SearchPhotosViewController)
}

class LoaderData: LoaderDelegate {
  func LoadData() {
    print("Hello from LoaderData")
  }
}

class SearchPhotosViewController: UICollectionViewController {

  // MARK: - Properties
  weak var delegate: LoaderDelegate?

  override func viewDidLoad() {
    super.viewDidLoad()
    print("Hello from viewDidLoad")
    delegate?.LoadData()
  }

}

首先,您应该从
LoaderDelegate.LoadData
中删除参数,因为当前代码未编译(
LoaderData.LoadData
的签名与协议的签名不匹配)

您已正确设置了委托,但尚未为委托设置值。通常,委托模式用于“向后传递数据”。在显示
SearchPhotosViewController
的视图控制器(或使用
SearchPhotosViewController
的任何东西)中,您将
委托设置为
LoaderData
的实例:

searchPhotosViewController.delegate = LoaderData()
现在,当加载search photos视图时,您将在日志中看到“Hello from LoaderData”

如果
SearchPhotosViewController
实际上是根VC,那么这里可能不适合使用委托模式。但是您仍然可以通过在
viewDidLoad
中设置
delegate
,使其打印“Hello from LoaderData”(但这有点毫无意义):


需要有人创建一个强持有的
LoaderData
实例,并将其分配给
SearchPhotosViewController
中的
delegate
。现在,它只是
nil
,因此什么也不做。这通常由演示VC完成。委托为零。您需要一些类来显式处理
委托
,请检查以下内容:我不太明白应该在何处添加“searchPhotosViewController.delegate=LoaderData()”?@CoffeinTime视图控制器显示什么
searchPhotosViewController
?在显示
SearchPhotosViewController
之前写上这行。我不明白。如何将此代码放置在LoaderData类或SearchPhotosViewController类以外的其他位置,这将导致错误。@Coffeintime您的项目中是否只有这两个类?如果是这样,则不应使用委托模式。读我的最后一段,我只是想了解它们是如何工作的。将来我想用它上传照片。委托不是为了这些目的而创建的吗?将部分职责转移到另一个班级。
searchPhotosViewController.delegate = LoaderData()
override func viewDidLoad() {
    super.viewDidLoad()
    print("Hello from viewDidLoad")
    delegate = LoaderData()
    delegate?.LoadData()
}