изменение ползунка влияет на другие ячейки таблицы - PullRequest
0 голосов
/ 04 ноября 2011

В каждой ячейке моей таблицы есть ползунок и метка для отображения его значения.Если я перемещаю ползунок, сохраняя все прикосновения внутри ячейки, метка обновляется, как и ожидалось.Однако если при перетаскивании ползунка касания переходят в другую ячейку, метка для второй ячейки обновляется, а большой палец ползунка первой ячейки перемещается.Как я могу ограничить изменение метки первой ячейкой, из которой произошло событие ползунка?

-(IBAction)sliderChanged:(id)sender forEvent:(UIEvent*)event
{    
    NSSet *allTouches = [event allTouches];
    UITouch *firstTouch = [[allTouches allObjects] objectAtIndex:0];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[firstTouch locationInView:self.tableView]];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    if (cell)
    {
        UISlider *slider = (UISlider*)sender;
        UILabel *sliderValueLabel = (UILabel*)[cell viewWithTag:kSliderValueLabelTag];
        sliderValueLabel.text = [NSString stringWithFormat:@"%0.2f", slider.value];
    }
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Когда вы перемещаете слайдер, он постоянно вызывает ваш метод sliderChanged. И в этом методе вы меняете метку ячейки, в которой находится касание, то есть неправильная ячейка, когда ваше касание переходит в другую ячейку.

Что бы я сделал:

  1. объявляет метод sliderChange в обычном классе, который расширяет UITableViewCell
  2. свяжите действие ползунка с этим методом, так как оно находится в ячейке, у вас всегда будет правильная ячейка
  3. изменить метку этой ячейки с методом self.label

Вы также можете:

  1. call ((MyUITableViewCell *) slider.superview) .label (если слайдер является прямым подпредставлением вашей ячейки)
  2. при первом касании запомните правильную ячейку в глобальной переменной (потому что здесь вы каждый раз воссоздаете переменную)
0 голосов
/ 04 ноября 2011

Ваш код кажется мне разумным, хотя, чтобы быть непротиворечивым, я бы получил ячейку от "ползунка", а не полагался на координаты точек касания.Может случиться так, что массив «allTouches» не возвращается так далеко, как вы хотели бы к исходному нажатию.

Чтобы сделать это, вам нужно получить superView слайдера, а затем использоватьчтобы получить viewWithTag:.

Предполагая, что ползунок и метка содержатся в одном представлении, вы можете попробовать что-то вроде:

UIView *cellContentView = slider.superView;
UILabel *sliderValueLabel = [cellContentView viewWithTag:kSliderValueLabelTag];

Если вы не хотите полагаться наДля просмотра иерархий можно также поместить тег на ползунке, соответствующий строке в вашей таблице, а затем использовать его для извлечения ячейки.

...