以编程方式在UITableViewCells中嵌入多个UISlider和UILabel控件

时间:2013-01-05 21:48:45

标签: ios cocoa-touch uitableview uilabel uislider

我是一名iOS Dev新手,非常感谢如何以编程方式在UITableView中创建多个UISlider和UILabel控件,如图所示:

mockup

如上面的样机图片中所示,当相应的滑块(在同一行上)发生变化时,我只需要更新相关的标签文本。

使用下面的代码,我可以为表视图中的每一行动态创建多个滑块控件,但是当滑块的值发生变化时,我无法显示相应的标签并更新此标签文本。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *ControlRowIdentifier = @"ControlRowIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ControlRowIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:ControlRowIdentifier];


        CGRect frame = CGRectMake(0.0, 0.0, 100.0, 10.0);
        UISlider *slider = [[UISlider alloc] initWithFrame:frame];
        [slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
        [slider setBackgroundColor:[UIColor clearColor]];
        slider.minimumValue = 1;
        slider.maximumValue = 70;
        slider.continuous = YES;
        slider.value = 30;

        cell.accessoryView = slider;
    }
    NSUInteger row = [indexPath row];
    NSString *rowTitle = [list objectAtIndex:row];
    cell.textLabel.text = rowTitle;

    return cell;
}

//Does not work
- (IBAction)sliderAction:(id)sender {
    UISlider *sliderControl = (UISlider *)sender;
    int SliderValue = (int)roundf(sliderControl.value);
    UILabel *sliderLabel;
    sliderLabel.text = [NSString stringWithFormat:@"%d", SliderValue];
    [self.view addSubview:sliderLabel];
}

2 个答案:

答案 0 :(得分:0)

您应该将滑块创建移出if指令:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *ControlRowIdentifier = @"ControlRowIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ControlRowIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
               reuseIdentifier:ControlRowIdentifier];
    }
    CGRect frame = CGRectMake(0.0, 0.0, 100.0, 10.0);
    UISlider *slider = [[UISlider alloc] initWithFrame:frame];
    [slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
    [slider setBackgroundColor:[UIColor clearColor]];
    slider.minimumValue = 1;
    slider.maximumValue = 70;
    slider.continuous = YES;
    slider.value = 30;

    cell.accessoryView = slider;

    NSUInteger row = [indexPath row];
    NSString *rowTitle = [list objectAtIndex:row];
    cell.textLabel.text = rowTitle;

    return cell;
}

答案 1 :(得分:0)

我在这里看到了几个问题。

  1. 您永远不会实例化任何标签以显示滑块值。您需要实例化它并将其放入表格单元的视图层次结构中。
  2. 您将UITableViewDataSource设置为滑块操作的目标。这使得难以知道哪个标签对应于哪个滑块。您应该通过子类化或向contentView添加UIView子类来自定义UITableViewCell。滑块应该以单元格或视图子类为目标,标签更新可能在那里发生。还有其他方法可以做到这一点。
  3. sliderAction:方法中,您永远不会初始化sliderLabel变量。您需要将其设置为与单元格对应的UILabel实例,如上所述。