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

Posted

技术标签:

【中文标题】以编程方式在 UITableViewCells 中嵌入多个 UISlider 和 UILabel 控件【英文标题】:Programmatically embed multiple UISlider and UILabel controls in UITableViewCells 【发布时间】:2013-01-05 21:48:45 【问题描述】:

我是一名 ios 开发新手,希望能提供有关如何以编程方式在 UITableView 中创建多个 UISlider 和 UILabel 控件的任何帮助,如图所示:

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

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

- (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];

【问题讨论】:

明确地说,您希望滑块值以每个单元格为基础将标签值更改为左侧?另外,请清楚什么是行不通的。 请使用自定义单元格,这将对您有所帮助 【参考方案1】:

您应该将滑块创建移出 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;

【讨论】:

它将为每个表格单元格实例化一个滑块,代码取自这里:developer.apple.com/library/ios/#documentation/userexperience/…。那么是的,正如您在回答中注意到的那样,还缺少其他内容。【参考方案2】:

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

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

【讨论】:

非常感谢,卡尔。我会听从你的建议,会让你知道我的进展。干杯。

以上是关于以编程方式在 UITableViewCells 中嵌入多个 UISlider 和 UILabel 控件的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 UITableViewCells

如何以编程方式使用 CellStyle = .value1 初始化/使用 UITableViewCells?

UIScrollView 内的可选 UITableViewCells

以编程方式打开 UITableView 编辑操作按钮

以编程方式创建 UITableViewCell 或从 nib 加载是不是更快?

以编程方式约束表格单元格中的 UILabel