UIStepper not updating the Corresponding Label

三世轮回 提交于 2019-12-13 00:33:56

问题


I have a UIStepper control that i created programmaticly in my UITableViewCell. I also created a UILabel programmaticly for the cell. whats happening is that the stepper when pressed is accessing a UILabel located in a different cell i.e index path 1 and not 0. here is the code.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
...
 //---------UIStepper Creation-------------------//

stepper = [[UIStepper alloc]init];
[stepper setFrame:CGRectMake(220.0f, 65.0f, 0.0f, 0.0f)];
[stepper setTag: indexPath.row];
[stepper addTarget:self action:@selector(stepperPressed:) forControlEvents:UIControlEventValueChanged];

stepperLabel = [[UILabel alloc] init];
[stepperLabel setFrame:CGRectMake(105,70, 20, 20)];
[stepperLabel setTextColor:[UIColor whiteColor]];
[stepperLabel setBackgroundColor:[UIColor clearColor]];
[stepperLabel setTag:stepper.tag];
[stepperLabel setText:[NSString stringWithFormat: @"%d", (int) [stepper value]]];
stepperLabel.lineBreakMode = UILineBreakModeWordWrap;
stepperLabel.numberOfLines = 1;//Dynamic

//Set min and max
[stepper setMinimumValue:0];
[stepper setMaximumValue:4];
// Value wraps around from minimum to maximum
[stepper setWraps:YES];
[stepper setContinuous:NO];

// To change the increment value for each step

...
[cell addSubview:stepperLabel];
[cell addSubview:stepper];
return cell;

and here is where i need the action to be performed

-(void) stepperPressed:(UIStepper *)sender{
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[sender superview]];
int row = indexPath.row;
NSLog(@"stepper is in row %d",row);
NSLog(@"stepperLabel is in row %d",stepperLabel.tag);
double value = [sender value];
if(sender.tag ==row){
  [stepperLabel setText:[NSString stringWithFormat: @"%d", (int) value]];
}
}

seriously need some help guys


回答1:


stepperLabel will always point to the label at the last Cell you created in cellForRowAtIndexPath. So you can't use it this way.

Edited Answer:

- (void)viewDidLoad {
    [super viewDidLoad];
    valueArray=[[NSMutableArray alloc]initWithObjects:[NSNumber numberWithInt:0],[NSNumber numberWithInt:0],[NSNumber numberWithInt:0], nil]; //Array Count = 
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10.0f, 10.0f, 100.0f, 21.0f)];
       [cell addSubview:label];
       [label setTag:456];

       UIStepper *stepper = [[UIStepper alloc]initWithFrame:CGRectMake(110.0f, 10.0f, 20.0f, 20.0f)]; 
       [cell addSubview:stepper];
       [stepper setTag:123];
       [stepper addTarget:self action:@selector(stepperChanged:) forControlEvents:UIControlEventValueChanged];        
   }
   [cell setTag:indexPath.row];
   int count = [[valueArray objectAtIndex:indexPath.row] intValue];

   [(UIStepper*)[cell viewWithTag:123] setValue:count];
   [(UILabel*)[cell viewWithTag:456] setText:[NSString stringWithFormat:@"%@: %d", @"Stepper", count]];
    return cell;
}
- (void)stepperChanged:(UIStepper*)sender {
    int row = [sender.superview tag];
    int value = (int)[sender value];
    NSLog(@"Stepper%d = %d", row,value);

    [valueArray replaceObjectAtIndex:row withObject:[NSNumber numberWithInt:value]];

    [(UILabel*)[(UITableViewCell *)sender.superview viewWithTag:456] setText:[NSString stringWithFormat:@"%@: %d", @"Stepper", value]];
}


来源:https://stackoverflow.com/questions/11067334/uistepper-not-updating-the-corresponding-label

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!