0

嗨,我有一个 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 委托方法中设置标签的文本吗?

4

3 回答 3

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

于 2013-05-22T06:31:04.833 回答
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

}
于 2013-05-22T06:36:57.743 回答
0

您应该使用步进器的值更新模型,然后根据模型中的值设置标签的值。您应该在 cellForRowAtIndexPath 中为步进器提供一个等于 indexPath.row 的标签,并在步进器的操作方法中,将模型中的属性值设置为步进器的值。然后,在同一 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。

于 2013-05-22T06:45:56.283 回答