UISlider поврежден

Я программно встроил UISlider в каждый UITableViewCell, но я заметил, что первые 2 из этих UISlider всегда повреждены, как показано на рисунке ниже.

Часть кнопки UISlider остается позади, когда я перемещаю ее в первый раз. Кто-нибудь еще испытывал такую ​​же проблему? Пожалуйста, скажите мне, если вам нужно увидеть мой код.

Помимо этой проблемы, UIlabel, который связан с UISlider рядом с ним, работает хорошо.

Более подробная информация: Моя функция cellForRowAtIndexPath выглядит так, как показано ниже. Пожалуйста, найдите второй последний абзац для части, где я добавляю UISlider. Я также сомневался, что могу добавить более 1 слайдера в ячейку. Я проверил, что каждый ползунок добавляется только один раз, проверив вывод NSLog для строки:

NSLog(@"initiating slider at section %d row %d", indexPath.section, indexPath.row);

Каждая комбинация раздела и строки уникальна!

Я также нахожу странным, что это влияет только на UISliders в верхних 2 строках, независимо от количества строк tableViewCell, которые есть в моей таблице.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//creating a basic valid cell object
static NSString *cellIdentifier = @"ActivitiesTVCcell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (!cell){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

if(indexPath.section == 0){
    NSArray *rowNames = [self.phpReply_ActivitiesTVC componentsSeparatedByString:@"\n"];
    cell.textLabel.text = [rowNames objectAtIndex:indexPath.row+2];
}
else if (indexPath.section == 1){
    if (indexPath.row == 0) {
        cell.textLabel.text = @"Seated";
    }
    else if (indexPath.row == 1){
        cell.textLabel.text = @"Standing";
    }
}

cell.selectionStyle = UITableViewCellSelectionStyleNone;



//start code addition of graph button stuff
UIButton *graphButton = [UIButton buttonWithType:UIButtonTypeCustom];
[graphButton setFrame:CGRectMake(224, 0, 43, 37)];
[graphButton setBackgroundImage:[[UIImage imageNamed:@"graph icon.png"] stretchableImageWithLeftCapWidth:1.0 topCapHeight:1.0] forState:UIControlStateNormal];
[graphButton setBackgroundImage:[[UIImage imageNamed:@"graph icon.png"] stretchableImageWithLeftCapWidth:1.0 topCapHeight:1.0] forState:UIControlStateSelected];

[graphButton addTarget:self
                action:@selector(graphButtonPressed:)
      forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:graphButton];
//end code addition of graph button stuff


//start code addition of video button stuff
UIButton *videoButton = [UIButton buttonWithType:UIButtonTypeCustom];
[videoButton setFrame:CGRectMake(300, 0, 43, 37)];
[videoButton setBackgroundImage:[[UIImage imageNamed:@"videoicon.png"] stretchableImageWithLeftCapWidth:1.0 topCapHeight:1.0] forState:UIControlStateNormal];
[videoButton setBackgroundImage:[[UIImage imageNamed:@"videoicon.png"] stretchableImageWithLeftCapWidth:1.0 topCapHeight:1.0] forState:UIControlStateSelected];

[videoButton addTarget:self action:@selector(videoButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:videoButton];
//end code addition of video button stuff


//start code for addition of enable switch
UISwitch *activityEnableSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(376, 7, 0, 0)]; //size components of CGRect are ignored
[activityEnableSwitch setOn:NO animated:YES];
[activityEnableSwitch addTarget:self
                         action:@selector(enableSwitchStateChanged:)
               forControlEvents:UIControlEventValueChanged];
[cell addSubview:activityEnableSwitch];
//end code for addition of enable switch

//start code for addition of target angle text field
UITextField *targetAngleTextField = [[UITextField alloc] initWithFrame:CGRectMake(476, 7, 50, 25)];
targetAngleTextField.borderStyle = UITextBorderStyleRoundedRect;
targetAngleTextField.font = [UIFont systemFontOfSize:15];
targetAngleTextField.textColor = [UIColor blackColor];
targetAngleTextField.placeholder = @"30";
targetAngleTextField.autocorrectionType = UITextAutocorrectionTypeNo;
targetAngleTextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
targetAngleTextField.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
targetAngleTextField.keyboardType = UIKeyboardTypeNumberPad; //no num pad on ipad :(
//[targetAngleTextField becomeFirstResponder];
targetAngleTextField.delegate = self;

[cell addSubview:targetAngleTextField];
//end code for addition of target angle text field

//start code for addition of degree text label
UILabel *degreeLabel = [[UILabel alloc] initWithFrame:CGRectMake(532, 6, 10, 10)];
degreeLabel.text = @"o";
degreeLabel.font = [UIFont systemFontOfSize:10];
[cell addSubview:degreeLabel];
//end code for addition of degree text label

//start code for addition of progression level UISlider
NSLog(@"initiating slider at section %d row %d", indexPath.section, indexPath.row);
UISlider *progressionLevelSlider = [[UISlider alloc] initWithFrame:CGRectMake(576, 7, 150, 25)];
progressionLevelSlider.minimumValue = 0;
progressionLevelSlider.maximumValue = 9;
progressionLevelSlider.continuous = YES;
progressionLevelSlider.value = 3;

[progressionLevelSlider addTarget:self
           action:@selector(progressionSliderValueChanged:)
 forControlEvents:UIControlEventValueChanged];

[cell addSubview:progressionLevelSlider];
//end code for addition of progression level UISlider

//start code for addition of level ? text label
UILabel *progressionLevelLabel = [[UILabel alloc] initWithFrame:CGRectMake(782, 13, 10, 20)];
progressionLevelLabel.text = [NSString stringWithFormat:@"%d", 2];
progressionLevelLabel.font = [UIFont systemFontOfSize:17];
progressionLevelLabel.tag = 121; //tag represents this particular UIlabel, so that we can set it from outside this function.
[cell addSubview:progressionLevelLabel];
//end code for addition of level ? text label


[cell setTag:(indexPath.section)*100+indexPath.row];

return cell;
}

Вот моя функция sliderValueChanged. Я размещаю этот код здесь, поскольку "повреждение" можно увидеть только после перетаскивания ползунка (чтобы изменить его значение).

-(void)progressionSliderValueChanged: (UISlider *)sender {
int section = ([sender superview].tag)/100;
int row = [sender superview].tag%100;

int value = sender.value;

NSLog(@"slider value at section %d row %d was slided to %d",section, row, value);

UITableViewCell *superViewOfSlider = (UITableViewCell *)[sender superview];
UILabel *progressionLevelLabel = (UILabel *)[superViewOfSlider viewWithTag:121];
progressionLevelLabel.text = [NSString stringWithFormat:@"%d", value];
[superViewOfSlider addSubview:progressionLevelLabel];

}

1 ответ

Решение

Каждый раз, когда ячейка используется повторно, вы добавляете в нее новый набор подпредставлений. Расскажите весь код, который создает эти подпредставления, и переместите его в блок, где вы создаете ячейку. После этого блока вам просто нужно найти нужные подпредставления (например, с помощью тегов) и установить значения этих подпредставлений.

Другие вопросы по тегам