Iphone 返回视图时iOS UISlider旋钮重影

Iphone 返回视图时iOS UISlider旋钮重影,iphone,objective-c,ios,uislider,Iphone,Objective C,Ios,Uislider,在tableviewcell中,我有一个UISlider。如果我移动滑块旋钮,返回到我以前的视图,然后返回到表视图,滑块上的旋钮返回到零,但我看到了旋钮的“重影”,我之前也移动了滑块 我清除cellForRowAtIndexPath:中滑块对象的上下文视图,并在ViewDidDisplay中重新加载表 有人知道怎么解决这个问题吗?真烦人。我把滑块代码放在下面,如果有帮助的话 // Setup slider CGRect sliderFrame = CGRectMa

在tableviewcell中,我有一个UISlider。如果我移动滑块旋钮,返回到我以前的视图,然后返回到表视图,滑块上的旋钮返回到零,但我看到了旋钮的“重影”,我之前也移动了滑块

我清除cellForRowAtIndexPath:中滑块对象的上下文视图,并在ViewDidDisplay中重新加载表

有人知道怎么解决这个问题吗?真烦人。我把滑块代码放在下面,如果有帮助的话

        // Setup slider
        CGRect sliderFrame = CGRectMake(15, 56, 230, 0);
        UISlider *slider = [[UISlider alloc] initWithFrame:sliderFrame];
        slider.clearsContextBeforeDrawing = YES;
        [slider addTarget:self action:@selector(sliderUpdated:) forControlEvents:UIControlEventValueChanged];
        [slider addTarget:self action:@selector(sliderStopped:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:slider];
        [slider release];

我很感激!谢谢

很可能您正在旧的
UISlider
上创建一个新的
UISlider
,从而产生重影效果

两种可能的解决办法

  • UISlider添加到单元格时,标记它

  • 子类
    UITableViewCell
    并将
    UISlider
    添加到其内容视图中,并使用ivar保留对其的引用

  • 要执行1,只需在将
    UISlider添加到contentView时标记它。然后,当你再次得到一个单元格时,你可以尝试先取回视图,或者创建一个新的视图

    const int sliderViewTag = 99;
    
    UISlider *slider = [cell.contentView viewWithTag:sliderViewTag];
    
    if (!slider) {
      CGRect sliderFrame = CGRectMake(15, 56, 230, 0);
      slider = [[UISlider alloc] initWithFrame:sliderFrame];
      slider.clearsContextBeforeDrawing = YES;
      [slider addTarget:self action:@selector(sliderUpdated:) forControlEvents:UIControlEventValueChanged];
      [slider addTarget:self action:@selector(sliderStopped:) forControlEvents:UIControlEventTouchUpInside];
      [cell.contentView addSubview:slider];
      [slider release]; slider = nil;
    }
    

    虽然2有点复杂,但它是我的首选方法,但我确信有一些很好的例子可以说明如何做到这一点。Apple提供了一些很棒的文档,请查看它们,特别是查看部分
    更仔细地查看表格视图单元格

    您没有任何检查来查看是否已经绘制了滑块/您没有尝试获取以前绘制的滑块。我猜你只是在旧的滑块上画了一个新的滑块,因此你可以在背景中看到旧的滑块,它可能位于不同的位置。谢谢你的快速响应。这是有道理的,但是你怎么检查呢?是实际循环遍历单元的所有子视图以查看它们是否存在的最佳方法,如果它们没有创建它们,则只需更新它们即可?非常感谢Paul。这是我第一次尝试以编程方式添加子视图,因此我假设操作系统将负责重用子视图,而不是使用新的子视图来覆盖它们。