在由步进器 - 目标c控制的单元格中设置标签

时间:2013-05-22 06:22:51

标签: ios objective-c cocoa-touch

您好我有一个UITableView,我正在插入包含UIStepper和UILabel的单元格。 UILabel显示UIStepper的值。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if(!cell)
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

    [cell.textLabel setText:[self.myarray objectAtIndex:indexPath.row]];

    UIStepper *stepper = [[UIStepper alloc]init];

    UILabel *label = [[UILabel alloc]init];
    label.text = [NSString stringWithFormat:@"%.f", stepper.value];

    [cell addSubview:stepper];
    [cell addSubview:label];

    [stepper addTarget:self action:@selector(incrementStepper:) forControlEvents:UIControlEventValueChanged];
    return cell;
}

为了清楚起见,我已经删除了一些上面的格式化行,但是这样可行并且一切正常。

-(void)incrementSkillStepper:(id)sender
{
    UIStepper *stepper = (UIStepper*)sender;
    //set the label that is in the same cell as the stepper with index stepper.value.
}

当我单击特定单元格中的步进器时,我希望同一单元格中的标签增加,但我的问题在于addtarget的工作方式 - 我只能发送发件人,在这种情况下是步进器到事件,这意味着它无法访问动态创建的标签。有没有人知道我如何设置incrementStepper委托方法的标签文本?

3 个答案:

答案 0 :(得分:3)

致电[sender superview]以获取其所在的单元格

-(void)incrementSkillStepper:(id)sender
{
    UIStepper *stepper = (UIStepper*)sender;
    UITableViewCell* cell =  [stepper superview];

    UIView* subview = [[cell subviews] lastObject]; // Make sure your label *is* the last object you added.

    if ([subview isKindOfClass:[UILabel class]]) {
        // do what you want
    }
}

您也可以通过[cell.contentView subviews] array循环,获取所需的标签,最好为标签添加tag值,然后使用viewWithTag

答案 1 :(得分:0)

您可以将标记设置为UIStepper作为indexPath.row,并将标记设置为标记为indexPath.row + 999。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIStepper *stepper = [[UIStepper alloc]init];
    stepper.tag = indexPath.row;

    UILabel *label = [[UILabel alloc]init];
    label.tag = indexPAth.row + 999;

    //......
}

现在在UIStepper的委托方法中,你可以在这个单元格中找到像这样的标签

-(void)incrementSkillStepper:(id)sender
{
    UIStepper *stepper = (UIStepper*)sender;
    UILabel *label = (UILabel *)[self.view viewWithTag:sender.tag + 999];
    //now this is same label as you want. Now you can change the value of label as you want

}

答案 2 :(得分:0)

您应该使用步进器的值更新模型,然后根据模型中的值设置标签的值。您应该为步进器提供一个等于indexPath.row的cellForRowAtIndexPath标记,并在步进器的action方法中,将模型中属性的值设置为步进器的值。然后,在同一个indexPath处重新加载行。

(void)incrementSkillStepper:(UIStepper *)sender {
    NSInteger row = sender.tag;
    [self.theData[row] setObject:@(sender.value) forKey:@"stepperValue"];
    [self.tableView reloadRowsAtIndexPaths: @[row] withRowAnimation:UITableViewRowAnimationNone];
}

在cellForRowAtIndexPath中,你可以这样填充标签:

    UILabel *label = [[UILabel alloc]init];
    label.text = [NSString stringWithFormat:@"%@", self.theData[indexPath.row][@"stepperValue"]];

在这个例子中,我假设你有一个字典数组(theData),它包含填充单元格所需的所有数据。其中一个字典键,“stepperValue”将用于将步进器值存储为NSNumber。