Search code examples
objective-ccocoa-touchinterfaceuislidercorrupt

UISlider corrupted


I have programmatically embedded an UISlider in each UITableViewCell, but I noticed that the first 2 of these UISliders are always corrupted as shown in the image below.

enter image description here

A part of the UISlider's button gets left behind when I slide it the first time. Has anyone else experienced the same problem? Please tell me if you need to see my code.

Apart from this problem, the UIlabel that is connected to the UISlider beside it works well.

More details: My cellForRowAtIndexPath function is as below. Please look for the 2nd last paragraph for the part where I add the UISlider. I also doubted that I may be adding more than 1 sliders into the cell. I checked that the each slider only gets added once by checking the NSLog output for the line:

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

Each combination of section and row is unique!

I also find it weird that only the UISliders in the top 2 rows get affected by this, regardless of the number of tableViewCell-rows I have in my table.

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

Here is my sliderValueChanged function. I am putting this code here since the 'corruption' can only be seen after dragging the slider (to change its value).

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

}


Solution

  • Every time a cell is reused, you're adding a whole new set of subviews to the cell. Tale all the code that creates those subviews and move it inside the block where you create the cell. After that block, you just need to find the subviews you need (using tags, for example) and set the values of those subviews.