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。
但是有一些情况是你在做之前必须考虑的,例如:
- 所有单元将遵循相同的协议,因此所有单元的 activityIndicator 进度更新将始终相同。
- 由于 dequeueReusableCell
,您需要仅在单元格可见时更新单元格
因此,我的建议也与@Hossam 在评论中建议的相同,即从 VC (UploadingManager) 更新单元格。
我想知道是否可以使 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。
但是有一些情况是你在做之前必须考虑的,例如:
- 所有单元将遵循相同的协议,因此所有单元的 activityIndicator 进度更新将始终相同。
- 由于 dequeueReusableCell ,您需要仅在单元格可见时更新单元格
因此,我的建议也与@Hossam 在评论中建议的相同,即从 VC (UploadingManager) 更新单元格。