使用xib更新了子类UITableViewCell

时间:2013-10-28 23:53:47

标签: ios objective-c uitableview

我的应用程序正在模仿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”标签是我正在尝试更新的标签: enter image description here

由于它正确打印到控制台,我唯一能想到的问题是细胞没有正确重绘。我甚至尝试在包含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中反映出来。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为你在寻找setNeedsDisplay?对于诸如转动屏幕之类的事件,您只需要setNeedsLayout,而不是重绘数据。

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

dispatch_async(dispatch_get_main_queue(), ^{ [self setNeedsDisplay]; });
相关问题