UITableViewCells 可以是代表吗?

Can UITableViewCells be delegates?

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

这是我目前的代码:

协议

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

上传管理器class

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

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)
  }
}

是的,这是可能的,您可以按照描述here

但是有一些情况是你在做之前必须考虑的,例如:

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

因此,我的建议也与@Hossam 在评论中建议的相同,即从 VC (UploadingManager) 更新单元格。