我的应用程序正在模仿Apple VoiceMemos应用程序。您可以在UITableViewCell
内选择和播放音频的位置。
我有一个带有关联xib文件的子类UITableViewCell
。我有一个单例类设置来处理播放音频。播放音频工作正常,但我似乎无法让单元格中的标签正确更新。添加标签和xib文件,应该更新剩余时间和剩余时间。
我的音频播放器单例类有一个块参数,它将timeAlreadyPlayed和timeRemaining作为变量传回去:
(这是在AudioTableCell子类中)
[PNAudioController sharedController].playBackBlock = ^(NSString* timeAlreadyPlayed, NSString* timeRemaining, NSTimeInterval currentPlaybackTime) {
NSAssert([NSThread mainThread], @"I need to be on the main thread.");
NSLog(@"timeAlreadyPlayed = %@", timeAlreadyPlayed);
//Labels created in xib and liked to UITableViewCell subclass
self.timeRemainingLabel.text = timeRemaining;
self.timeAlreadyPlayedLabel.text = timeAlreadyPlayed;
self.currentTimeSlider.value = currentPlaybackTime;
[self setNeedsLayout];
};
NSLog
语句会正确打印到控制台,但单元格中的标签无法正确更新。我确实看到设置setNeedsLayout应该在下一个更新周期中将其标记为重绘但是没有做任何事情。
我的tableCell看起来像的图片,两个“10:00”标签是我正在尝试更新的标签:
由于它正确打印到控制台,我唯一能想到的问题是细胞没有正确重绘。我甚至尝试在包含UIViewController
数据源和委托代码的UITableView
中触发重新加载,但这也不起作用。
编辑: 回应rdelmar:
如果我在块中注销标签及其文字:
VideoContentTypeTest[24158:70b] timeRemainingLabel = <UILabel: 0x10c32a170; frame = (263 39; 42 21); text = '-55.61'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x10c329850>>
VideoContentTypeTest[24158:70b] timeRemainingLabel.text = -55.61
标签不是零,文字 正确更新。它永远不会在UI中反映出来。
答案 0 :(得分:0)
尝试用self
替换标签的[PNAudioController sharedController]
引用,看看是否能修复它。我不是块的专家,但可能self
并不是指那个范围内的自定义单元格,不确定。
答案 1 :(得分:0)
通常,当您获得新数据时,您将更新用于填充表视图的数组,然后调用reloadData。所以,我会使用你的回调块来更新表视图控制器类中的数组(可能是一个字典数组),并使用该数组来填充单元格。我认为将数据添加到cellForRowAtIndexPath之外的表格视图单元格不是一个好主意。
答案 2 :(得分:0)
我认为你在寻找setNeedsDisplay
?对于诸如转动屏幕之类的事件,您只需要setNeedsLayout
,而不是重绘数据。
另外,如果您想在主线程上执行代码,可以调用:
dispatch_async(dispatch_get_main_queue(), ^{ [self setNeedsDisplay]; });