滑块更改会影响其他表格单元格

时间:2011-11-03 23:14:10

标签: ios uitableview uislider uitouch

我的每个表格单元格都有一个滑块和一个标签来显示其值。如果我在保持细胞内所有触摸的同时移动滑块,标签会按预期更新。但是,如果在拖动滑块时,触摸交叉到另一个单元格,则第二个单元格的标签会在第一个单元格滑块的拇指移动时更新。如何将标签更改限制为滑块事件源自的第一个单元格?

-(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 :(得分:0)

你的代码看起来很合理,虽然为了保持一致,我会从“滑块”获取单元格,而不是依赖于触摸点的坐标。可能是“allTouches”数组不会回到你想要的原始印刷机。

为此,您需要获取滑块的superView,然后使用它来获取viewWithTag:。

假设滑块和标签包含在同一视图中,您可以尝试类似:

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

如果您不想依赖视图层次结构,您还可以在滑块上放置一个与表中行对应的标记,然后使用它来拉取单元格。

答案 1 :(得分:0)

移动滑块时,它会不断调用sliderChanged方法。在这种方法中,您可以更改触摸所在的单元格的标签,即当您的触摸进入另一个单元格时,这是错误的单元格。

我会做什么:

  1. 在扩展UITableViewCell
  2. 的自定义类中声明sliderChange方法
  3. 将滑块操作链接到此方法,因为它位于单元格中,您始终拥有正确的单元格
  4. 使用self.label
  5. 更改具有此方法的单元格的标签

    你也可以:

    1. 调用((MyUITableViewCell *)slider.superview).label(如果滑块是您单元格的直接子视图)
    2. 在第一次触摸时,记住全局变量中的正确单元格(因为这里每次都重新创建变量)