UITableViewCells可以作为委托吗?

时间:2020-07-08 05:00:57

标签: ios swift uitableview delegates protocols

我想知道是否可以使UITableViewCell符合协议,并将UITableViewCell设置为委托。原因是,因为当另一个类中的某个值更改时,我希望某些UITableViewCells进行更新,因此我正在考虑使用协议/委托方法进行此操作。但是,到目前为止,我还无法成功将UITableViewCell转换为委托。甚至有可能吗?

这是我到目前为止的代码:

协议

protocol UploadManagerDelegate: AnyObject {
  func taskWasUpdated(id: String, value: Double)
}

上传管理器类

public final class UploadingManager {
  static var uploadingTasks: Dictionary<String, Double> = [:]
  static weak var uploadDelegate: UploadManagerDelegate

  static func removeTask(id: String) {
    uploadingTasks.removeValue(forKey: id)
  }
  
  static func getTask(id: String) -> Double? {
    if uploadingTasks[id] == nil {
      return nil
    } else {
      return uploadingTasks[id]
    }
  }
  
  static func isUploading(id: String) -> Bool {
    return (uploadingTasks[id] != nil)
  }
  
  static func updateTask(id: String, completion: Double) {
    uploadingTasks[id] = completion
    uploadDelegate?.taskWasUpdated(id: id, value: completion)
  }
}

自定义UITableViewCell类

class TrackCell: UITableViewCell, UploadManagerDelegate {

...

override func awakeFromNib() {
  UploadingManager.uploadDelegate = self // Can I do this??
  super.awakeFromNib()
}

...

func taskWasUpdated(id: String, value: Double) {
  if(audioFile?.trackID == id) {
    activityIndicator.setProgress(Float(value), animated: true)
  }
}

1 个答案:

答案 0 :(得分:0)

是的,您可以按照here的说明进行操作。

但是在执行某些操作之前,您必须考虑一些情况,例如:

  1. 所有单元格将遵循相同的协议,因此activityIndi​​cator进度更新在所有单元格上始终相同。
  2. 由于dequeueReusableCell,您仅需要在单元格可见时更新单元格

所以,我的建议也与在从VC(UploadingManager)更新单元的注释中建议的@Hossam相同。