0

私は iOS Dev の初心者であり、図に示すように、プログラムで 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];
}
4

2 に答える 2

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;
}
于 2013-01-05T22:15:25.593 に答える
0

ここにはいくつかの問題があります。

  1. スライダーの値を表示するラベルをインスタンス化することはありません。これをインスタンス化し、テーブル セルのビュー階層に入れる必要があります。
  2. UITableViewDataSourceをスライダー アクションのターゲットとして設定します。これにより、どのラベルがどのスライダーに対応するかを知ることが難しくなります。サブクラス化するか、UIView サブクラスを に追加して、UITableViewCell をカスタマイズする必要がありcontentViewます。スライダーはセルまたはビューのサブクラスをターゲットにする必要があり、そこでラベルの更新が発生する可能性があります。これを行う他の方法もあります。
  3. sliderAction:メソッドでは、sliderLabel変数を初期化することはありません。UILabel上記のように、セルに対応するインスタンスに設定する必要があります。
于 2013-01-05T22:21:03.440 に答える