[ios]Xcode UISlider 添加到另一个单元格后滚动

发布时间: 2017/3/28 21:22:17
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

当我在我的表中滚动时在第 2 行 UISlider 是古怪搬到另一个单元格。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewsTickerFilterCell" forIndexPath:indexPath];

...

else if (indexPath.row == 2) {

        UISlider *radiusSlider = (UISlider *)[cell.contentView viewWithTag:20];
        if (!radiusSlider) {

            // ... noch nicht erstellt
            radiusSlider = [[UISlider alloc] initWithFrame:CGRectMake(screenWidth - sliderWidth - 70, 0, sliderWidth, 44)];
            [radiusSlider setMinimumValue:1];
            [radiusSlider setMaximumValue:50];
            [radiusSlider setValue:25];
            [radiusSlider setBackgroundColor:[UIColor clearColor]];
            [radiusSlider setTag:20]; // zur Erkennung, ob die View schon erstellt wurde
            [radiusSlider addTarget:self action:@selector(radiusSliderChangedValue:) forControlEvents:UIControlEventValueChanged];
            [cell.contentView addSubview:radiusSlider];
        }

    }

如何阻止这种行为?

谢谢你提前克里斯

解决方法 1:

这不是被移动到另一个单元格。这是因为细胞出列

这条线...

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewsTickerFilterCell" forIndexPath:indexPath];

检查缓存可用单元,并返回一个 (或创建一个新,如果没有一个可用)。当细胞移出屏幕他们然后重复使用。这意味着你可以有一个表,与成千上万的细胞和不耗尽内存。

不管怎么说,要修复它,您需要与此工作。你已经在使用 viewWithTag 所以我会坚持的但它会更好,有自定义 UITableViewCell 子类来做到这一点。

苏。

// I will ignore the else for demonstration purposes because I don't know what came before it
if (indexPath.row == 2) {

    UISlider *radiusSlider = (UISlider *)[cell.contentView viewWithTag:20];
    if (!radiusSlider) {
        // ... noch nicht erstellt
        radiusSlider = [[UISlider alloc] initWithFrame:CGRectMake(screenWidth - sliderWidth - 70, 0, sliderWidth, 44)];
        [radiusSlider setMinimumValue:1];
        [radiusSlider setMaximumValue:50];
        [radiusSlider setValue:25];
        [radiusSlider setBackgroundColor:[UIColor clearColor]];
        [radiusSlider setTag:20]; // zur Erkennung, ob die View schon erstellt wurde
        [radiusSlider addTarget:self action:@selector(radiusSliderChangedValue:) forControlEvents:UIControlEventValueChanged];
        [cell.contentView addSubview:radiusSlider];
    }
} else {
    // remove the slider from the cell if not row 2
    UISlider *radiusSlider = (UISlider *)[cell.contentView viewWithTag:20];
    [radiusSlider removeFromSuperView];
}

使用自定义类

你会有几个这样的方法...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // register your custom cell class with this reuse identifier in view did load
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewsTickerFilterCell" forIndexPath:indexPath];

    // this is pretty much all that should happen in here.
    [self configureSliderCell:(MyCustomSliderCell *)cell atIndexPath:indexPath];

    return cell;
}

- (void)configureSliderCell:(MyCustomSliderCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    //other configuration stuff here

    // the slider will already exist and be in the cell and be an outlet property
    // it will have the correct frame, min, max, etc...
    // all you need to do here is hide or show it depending on which row it is.
    cell.radiusSlider.hidden = indexPath.row != 2;
}
赞助商