gpt4 book ai didi

ios - 滚动后Xcode UISlider被添加到另一个单元格

转载 作者:行者123 更新时间:2023-11-28 21:56:49 25 4
gpt4 key购买 nike

当我在 TableView 中滚动时,第 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];
}

}

我怎样才能阻止这种行为?

提前致谢克里斯

最佳答案

这不会被移动到另一个单元格。这是因为单元格出队

这一行...

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

关于ios - 滚动后Xcode UISlider被添加到另一个单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26254460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com