1

我的应用程序正在模仿 Apple VoiceMemos 应用程序。您可以从中选择和播放音频UITableViewCell

我有一个UITableViewCell带有关联 xib 文件的子类。我有一个单例类设置来处理播放音频。播放音频效果很好,但我似乎无法正确更新单元格中的标签。添加了标签和 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

标签不是 nil 并且它的文本正在正确更新。它永远不会反映在 UI 中。

4

3 回答 3

0

尝试替换self标签的引用,[PNAudioController sharedController]看看是否可以解决它。我不是块专家,但可能self不是指该范围内的自定义单元格,不确定。

于 2013-10-29T00:01:46.833 回答
0

通常,当您获得新数据时,您会更新用于填充表视图的数组,然后调用 reloadData。所以,我会使用你的回调块来更新表视图控制器类中的一个数组(可能是一个字典数组),并使用该数组来填充你的单元格。我认为将数据添加到 cellForRowAtIndexPath 之外的表格视图单元格不是一个好主意。

于 2013-10-29T00:52:10.823 回答
0

我想你在找setNeedsDisplay?Afaik 您只需要setNeedsLayout诸如转动屏幕之类的事件,而不需要重绘数据。

另外,如果你想在主线程上执行代码,你可以调用:

dispatch_async(dispatch_get_main_queue(), ^{ [self setNeedsDisplay]; });
于 2013-10-29T14:45:44.380 回答