Ячейка не обновляет значение при изменении значения UISlider - PullRequest
4 голосов
/ 30 августа 2009

У меня есть вопрос, который сводит меня с ума. Все дело в обновлении в реальном времени UITableViewCell со значением UISlider, который находится внутри другого UITableViewCell.

Проблема

Ячейка обновлена, но кажется, что размер метки в ячейке не соответствует размеру представленного значения. Я постараюсь объяснить лучше.

UISlider имеет минимальное значение -100 и максимальное значение 100. Таким образом, при первой загрузке TableView cell.detailText.text показывает, что 0,0% отображается нормально, но когда Я перемещаю ползунок, и значение становится больше, например 55,5%, метка не может содержать эти дополнительные символы и отображает «55 .....»

Вот как я создаю ячейку, которая содержит значение UISlider, создаю UISlider в методе делегата cellForRowAtIndexPath


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

Вот как я создаю de UISlider в методе cellForRowAtIndexPath:


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];

Я подозреваю, что решение заключается в использовании reloadData метода UITableView, но не уверен. Я попытался вставить self.tableView.reloadData в метод sliderChanged, но я получил, что UISlider не двигается, и, наконец, я получил это исключение:
Завершение работы приложения из-за неперехваченного исключения «NSRangeException», причина: '- [NSCFArray objectAtIndex:]: index (0) за пределами (0)'

Заранее спасибо за помощь
Javi

Ответы [ 3 ]

1 голос
/ 30 августа 2009

Способ доступа к ячейке (по тегу) может не дать ожидаемой вами ячейки. Вы изначально не присваивали тег 1002? Проверьте значение celda. А затем, просто чтобы проверить, установите значение метки ячейки на что-то менее темное.

1 голос
/ 30 августа 2009

Почему вы используете currencyStyleStringFromNumber: при обновлении значения ячейки? Я думаю, вы получите лучшие результаты, используя тот же тип инициализатора, что и при первом вводе значения ползунка в ячейку, а именно:

cell.detailTextLabel.text = [NSString stringWithFormat:@"%.1f%%", slider.value];
0 голосов
/ 27 июня 2010

проблема в том, что ширина detailTextLabel фиксирована и вычисляется только тогда, когда метка будет отрисовываться в ячейке. поэтому, когда вы инициализируете метку с «0.0%», в ней будет место ровно 4 символа, и вы не сможете правильно визуализировать что-либо, кроме этого; дополнительные символы обрезаются на «...», или на ярлыке просто ничего не отображается.

Я обошел эту проблему, заставив метку содержать дополнительные пробелы в начале строки, например:

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

таким образом, мой ползунок может правильно отображать числа от 0 до 999; так как у вас больше символов, просто отрегулируйте желаемую длину.

...