0

サブビューとしてスライダーを追加したtableViewがあります。私は2つの方法でこれを試します。

方法1:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    }

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

問題:これを使用すると、テーブルをスクロールすると、スライダーがリロードされ、スライド値ではなく最小値が表示されます。だから私は2番目の方法を使用します。

方法 2:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier=[NSString stringWithFormat:@"CellIdentifier%d",indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; 
        UISlider* theSlider =  [[[UISlider alloc] initWithFrame:CGRectMake(174,12,120,23)] autorelease];
        theSlider.maximumValue=99;
        theSlider.minimumValue=0;
        [cell addSubview:theSlider];
    }  
    return cell;
}

問題: ビューに次のボタンがあります。タブで移動しようとすると、すべてのスライダーをリロードします (つまり、スライダーの値を最小に設定します)。テーブルをリロードしようとしましたが、望ましい結果が得られませんでした。

4

3 に答える 3

2

ユーザーがスライダーを変更すると、その最後の値を追跡する必要があります。次にcellForRowAtIndexPath:、スライダの値を最後に保存した値に設定する必要があります。

スライダーの値を保持するインスタンス変数を追加します。

NSMutableDictionary *_sliderValues; // don't forget to initialize this variable

// Helper method to located the slider in the cell
- (UISlider *)findSlider:(UIView *)view {
    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UISlider class]]) {
            return (UISlider *)subview;
        } else {
            UISlider *slider = [self findSlider:subview];
            if (slider) {
                return slider;
            }
    }

    return nil;
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; 
        UISlider *theSlider = [[[UISlider alloc] initWithFrame:CGRectMake(174,12,120,23)] autorelease];
        theSlider.maximumValue = 99;
        theSlider.minimumValue = 0;
        [theSlider addTarget:self action:@selector(sliderChanged:) forControlEvents: UIControlEventValueChanged];
        [cell.contentView addSubview:theSlider];
    }

    UISlider *slider = [self findSlider:cell];
    slider.tag = indexPath.row
    slider.value = [_sliderValue[@(slider.tag)] floatValue];

    return cell;
}

// Process changes to a slider
- (void)sliderChanged:(UISlider *)slider {
    NSInteger tag = slider.tag;
    [_sliderValues setObject:@(slider.value) forKey:@(tag)];
}

// called when the Next button is tapped
- (void)nextAction {
    [_sliderValues removeAllObjects];
    [self.tableView reloadData];
}

注: これはコンパイルも実行もされていません。タイプミスがあるかもしれません。

于 2013-03-06T06:03:43.610 に答える
0

次のボタンをクリックしたとき。テーブルビュー内のすべてのスライダーを取得し、ゼロにリセットします。

for (UISlider *but in [self.view.subviews subviews]) // or use [yourtableview subviews]
    { 
        if ([but isKindOfClass:[UISlider class]]) {
            [but setValue:0.0];
        }
    }
于 2013-03-06T13:18:30.883 に答える