UISlider 值更改时单元格未更新值

Posted

技术标签:

【中文标题】UISlider 值更改时单元格未更新值【英文标题】:Cell not updating value as UISlider value changed 【发布时间】:2009-08-30 09:25:49 【问题描述】:

我有一个问题让我发疯。这一切都是为了实时更新一个 UITableViewCell,它具有另一个 UITableViewCell 内的 UISlider 的值。

问题

单元格已更新,但单元格中标签的大小似乎与表示的值的大小不符。我会尽力解释得更好。

UISlider 的最小值为 -100,最大值为 100。因此,第一次加载 TableView 时,cell.detailText.text 显示 0.0% 女巫显示正常,但是当我移动滑块并且值更大时,例如 55.5%,标签不能容纳这个多余的字符,它显示“55.....”

这就是我创建包含 de UISlider 值的单元格的方式,在 cellForRowAtIndexPath 委托方法中创建 UISlider


cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ProductCellIdentifier] autorelease];
cell.textLabel.text=@"Performance";
cell.detailTextLabel.text = [NSString stringWithFormat:@"%.1f%%", slider.value];
cell.tag=1002;

这就是我在 cellForRowAtIndexPath 方法中创建 de UISlider 的方式:


cell = [[[UITableViewCellalloc] initWithFrame:CGRectZero                                                           reuseIdentifier:ProductCellIdentifier] autorelease];

slider = [[UISlideralloc] initWithFrame:CGRectMake(90, 12, 200, 25)];

slider.maximumValue = 100;
slider.minimumValue = -100;
slider.continuous = TRUE;

[slideraddTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventValueChanged];

[cell.contentView addSubview:slider];
cell.tag=0;
[slider release];  

这就是我在 sliderChanged 方法中所做的,以更新单元格。


UITableViewCell *celda= (UITableViewCell *)[[self tableView] viewWithTag:1002];
celda.detailTextLabel.text = [NSString stringWithFormat:@"%.1f%%", slider.value];

我怀疑解决方案是关于使用 UITableView 的 reloadData 方法,但不确定。我尝试在sliderChanged 方法中插入self.tableView.reloadData,但后来UISlider 没有移动,最后我得到了这个异常:由于未捕获的异常“NSRangeException”而终止应用程序,原因:'-[NSCFArray objectAtIndex:]: 索引 (0) 越界 (0)'

提前感谢您的帮助 哈维

【问题讨论】:

【参考方案1】:

为什么在更新单元格的值时使用currencyStyleStringFromNumber:?我认为使用与第一次将滑块的值放入单元格时相同的初始化程序会获得更好的结果,即:

cell.detailTextLabel.text = [NSString stringWithFormat:@"%.1f%%", slider.value];

【讨论】:

Tim,这正是我拥有的代码。我打错了。我已经更新了问题的描述。谢谢【参考方案2】:

您访问单元格的方式(按标签)可能无法获得您期望的单元格。您最初不是分配了标签 1002 吗?检查celda 的值。然后,为了检查,将单元格标签的值设置为不那么晦涩的值。

【讨论】:

对不起 Nikolai,正如 Tim 所说,我已经粘贴了其他类的代码。正如您在更正版本中看到的那样,我正在访问带有标签 1002 的单元格。所以应该这是访问单元格的正确方法。【参考方案3】:

问题在于 detailTextLabel 的宽度是固定的,并且仅在要在单元格中绘制标签时才计算。 因此,当您使用“0.0%”初始化标签时,正好有 4 个字符的空间,并且您无法正确可视化超过该值的任何内容;多余的字符要么用“...”修剪,要么标签不显示任何内容。

我通过强制标签在字符串的开头包含额外的空格来解决这个问题,如下所示:

while ([string length] <= 4)
      string = [NSString stringWithFormat:@" %@",prestring];
cell.detailTextLabel.text = string;

通过这种方式,我的滑块可以正确地显示从 0 到 999 的数字;由于您有更多字符,只需调整所需的长度即可。

【讨论】:

以上是关于UISlider 值更改时单元格未更新值的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewCell 奇怪的行为。单元格未正确更新图层

滑块值更改时快速更新表格中的单元格数

具有目标操作的单元格上的 iOS UIButton,单元格未在 (id)sender 中更新

Firestore - UITableViewCell 内的 UISlider

表格视图单元格未正确更新

嵌套集合视图单元格未在方向更改时调整大小