表视图中的滑块问题

时间:2013-02-18 10:03:04

标签: iphone ios objective-c xcode uitableview

在我的应用程序中,我在表格视图中添加一个滑块,即每行包含一个滑块&它也可以正常工作。

但是当我滚动表格视图时,滑块会重新加载,即每个都显示我的起始位置而不是滑块值。

//My code is as follow for slider in table cell:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

     NSString *CellIdentifier=[NSString stringWithFormat:@"CellIdentifier%d",indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];

        return cell;
    }


    UISlider*  theSlider =  [[[UISlider alloc] initWithFrame:CGRectMake(174,12,120,23)] autorelease];
        theSlider.maximumValue=99;
        theSlider.minimumValue=0;
        [cell addSubview:theSlider];

return cell;
}

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

您必须将滑块值存储在数组等中,并根据cellforrowatindexpath

中的数组值设置滑块值

答案 1 :(得分:0)

你可以这样做,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *CellIdentifier =[NSString stringWithFormat:@"Cell%d",indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

        UISlider*  theSlider =  [[[UISlider alloc] initWithFrame:CGRectMake(174,12,120,23)] autorelease];
        theSlider.maximumValue=99;
        theSlider.minimumValue=0;
        [cell addSubview:theSlider];
    }
    return cell;

}

答案 2 :(得分:0)

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

     NSString *CellIdentifier=[NSString stringWithFormat:@"CellIdentifier%d",indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
UISlider*  theSlider = nil;
    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];

theSlider     =  [[[UISlider alloc] initWithFrame:CGRectMake(174,12,120,23)] autorelease];
        theSlider.maximumValue=99;
       theSlider.tag =2;
        theSlider.minimumValue=0;
        [[cell contentView] addSubview:theSlider];
    }



return cell;
}

答案 3 :(得分:0)

我需要更多代码才能获得更好的答案。如果这对您没有帮助,请发布您的整个

-tableView: cellForRowAtIndexPath:

方法

我现在的猜测是,每次使用

重复使用单元格时,都要设置一个新的Slider
-tableView:dequeueReusableCellWithIdentifier:

(自然)每次都会在起始位置产生一个新的Slider。

您必须使用可以分配给正在重复使用的单元格的字典或滑块数组。

例如,如果TavbleView应该有20行,每行包含一个滑块,则需要一个包含20个滑块的数组,并执行类似

的操作

cell.slider = [mySliderArray objectAtIndex:indexPath.row]

这样,滑块就会保留这个值。

编辑:试试这个:(我稍微修改了上面的代码)

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

     NSString *CellIdentifier=[NSString stringWithFormat:@"CellIdentifier%d",indexPath.row];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

if (cell == nil) {

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];

    return cell;
}

//This is where you went wrong
//UISlider*  theSlider =  [[[UISlider alloc] initWithFrame:CGRectMake(174,12,120,23)] autorelease];
    //theSlider.maximumValue=99;
    //theSlider.minimumValue=0;
    //[cell addSubview:theSlider];

//this is what you need to do:
[cell addSubview: [mySlidersArray objectAtIndex:indexPath.row]];


return cell;
}

显然,您需要在viewDidload或其他任何地方设置一个名为'mySlidersArray'的滑块数组。

下一页编辑: 以下是我将如何创建滑块阵列:

NSMutableArray *arrayOfSliders = [NSMutableArray arrayWithCapacity: 20];
for (int i =0; i<20; i++){
    UISlider *slider = [[UISlider alloc] init];
    //set the slider-properties here, like you already did in your code
    [arrayOfSliders addObject: slider];
}

现在这些滑块可以在上面的代码中访问。

另一种方法是保留滑块的值数组,并在实例化之后将滑块设置为这些值。但这会导致性能非常差,因为将为屏幕上的每个单元格创建一个新的滑块。

如果您需要更多帮助,请告诉我 玩得开心