我有一个要求,我需要在UITableview的单元格中显示滑块。它基本上是一个下载表视图,其中音频项目继续下载,下载的进度被捕获并显示在tableview的单元格中。每次下载项目时,我都会收到一个委托方法,并调用reload表来更新表视图。这导致滚动问题,其中表格不会滚动平滑,因为它将重新加载单元格以进行项目下载。我该如何解决这个问题?
由于
答案 0 :(得分:1)
Accid Bright肯定是正确的,并且可能是一个超过可接受的解决方案。但是,如果您仍然看到性能问题,那么当它们被重新加载时,单元格仍然会做太多工作。我要做的是仅更新UISlider
:
NSIndexPath *indexPath = /* index path to the current row to be updated */
MyCustomCell *cell = (id)[self.tableView cellForRowAtIndexPath:indexPath];
[cell.slider setValue:DOWNLOAD_PROGRESS animated:NO];
在不相关的说明中,我建议您使用UIProgressView
代替UISlider
,因为它更适合显示进度。
答案 1 :(得分:0)
也许
// indexPaths array contains NSIndexPath of you cell with UISlider.
NSArray * indexPaths = @[[NSIndexPath indexPathForRow:1 inSection:0]];
[self.tableView reloadRowsAtIndexPath:indexPaths withRowAnimation:UITableViewRowAnimationNone];
可以帮到你。这允许仅更新一些行,而不是所有表。
即使它没有解决问题,最好只更新一行,而不是每秒更新所有数据到表。
答案 2 :(得分:0)
雨燕4 非常简单的方法就是使用它,只需复制过去的代码即可享受
@objc func sliderUpdate(slider: UISlider){
//MARK:- Add new row in table view
let indexPath = IndexPath(row: slider.tag, section: 0)
let cell = self.tableview.cellForRow(at: indexPath) as! MessagingSenderCell */MARK:- User user cell name because i am using the MessagingSenderCell for chat and i have use the slider for send a voice message/*
let cmTime = CMTime(seconds: audioPlayer.duration, preferredTimescale: 1000000)
let duration : CMTime = cmTime
var seconds : Float64 = CMTimeGetSeconds(duration)
self.tableview.beginUpdates()
cell.slider.maximumValue = Float(seconds)
self.slidertimer = Timer.scheduledTimer(withTimeInterval: 0.25, repeats: true) { timer in
seconds -= 0.25
if seconds <= 0 {
//print("Go!")
self.slidertimer.invalidate()
cell.slider.setValue(0, animated: false)
self.tablev.endUpdates()
} else {
// print(self.responds)
//print("Slider: " + "\(self.sliderr.value)")
//print("Player: " + "\(self.audioPlayer.currentTime)")
cell.slider.setValue(Float(self.audioPlayer.currentTime), animated: false)
}
}
}