【问题标题】:slider change affects other table cells滑块更改会影响其他表格单元格
【发布时间】:2011-11-03 23:14:10
【问题描述】:

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

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

【问题讨论】:

    标签: ios uitableview uislider uitouch


    【解决方案1】:

    您的代码对我来说看起来很合理,但为了保持一致,我会从“滑块”中获取单元格,而不是依赖于触摸点的坐标。可能是“allTouches”数组没有像您希望的那样返回原始印刷机。

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

    假设滑块和标签包含在同一个视图中,您可以尝试以下操作:

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

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

    【讨论】:

      【解决方案2】:

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

      我会做什么:

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

      您还可以:

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

      【讨论】:

        猜你喜欢
        • 2014-09-06
        • 2019-04-11
        • 2016-06-17
        • 1970-01-01
        • 2019-07-21
        • 2010-09-17
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        相关资源
        最近更新 更多