swift - 使用委托(delegate)时没有任何反应

标签 swift delegates

我正在尝试使用委托(delegate)(用于测试)将文本输出到 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的签名与协议(protocol)的签名不匹配).

protocol LoaderDelegate: class {
  func LoadData()
}

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

searchPhotosViewController.delegate = LoaderData()

现在当加载搜索照片 View 时,您将在日志中看到“Hello from LoaderData”。

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

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

关于swift - 使用委托(delegate)时没有任何反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809877/

相关文章:

swift - 如何使宽度单元格等于字符串长度?

ios - 图像缩放比例未重置

swift - iOS 14 上的 PKToolPicker 颜色选择器暗模式

ios - viewDidAppear 时如何调用 pickerview 的委托(delegate)?

c# - 以集合作为输入多次调用 Action<T>

iphone - StackScrollView 与委托(delegate) ID MBProgressHUD 的问题

如果滑动,Swift 不会触发 touchesBegan

swift - AVAudioPlayer 的 do/catch 是不必要的吗?

iphone - 没有进入功能-navigationController :willShowViewController:animated:

c# - 获取编译器生成的事件委托(delegate)