UITableView单元格的奇怪行为

时间:2013-07-27 17:10:07

标签: objective-c uitableview behavior

我创建了一个包含2个标签和1个UIStepper的单元格(动态)的UITableView。其中一个标签与UIStepper的值同步。到目前为止,非常好。

当UIStepper的值发生变化时,这就是我的代码:

- (IBAction)stepper:(id)sender {
    UITableViewCell *cell = (UITableViewCell *)[[sender superview] superview];
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    int row = indexPath.row;
    // I just determined in which row the user tapped the UIStepper.

    UIStepper *stepper = (UIStepper *)[cell viewWithTag:300];
    UILabel *menge = (UILabel *)[cell viewWithTag:100];
    int anzahl = stepper.value;
    menge.text = [NSString stringWithFormat:@"%i",anzahl];
    // and the label just got synced with the UIStepper value

    [_mengen insertObject:[NSString stringWithFormat:@"%i",anzahl] atIndex:row];
    // and the value got saved for further calculations
}

在第一行中按下UIStepper的 + 之后,可变数组 mengen 如下所示:

(
    1,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
)

正是这样,我预料到了!

但是不仅第一行中的标签 menge 被设置为1,第八行中的标签也被设置为1。如果我按第二行中的 + ,则第二行和第九行中的标签会发生变化,依此类推。

为什么会这样?

更新:cellForRowAtIndexPath方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    UILabel *artikel = (UILabel *)[cell viewWithTag:200];
    cell.selected = NO;
    [artikel setText:[_artikel objectAtIndex:[indexPath row]]];
    return cell;

}

2 个答案:

答案 0 :(得分:0)

单元格正在出列并重用值。如果您希望单元格反映该值,请使用将单元格indexpath.row映射到数组中的索引的数据源映射

答案 1 :(得分:0)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    UILabel *artikel = (UILabel *)[cell viewWithTag:200];
    cell.selected = NO;
    [artikel setText:[_artikel objectAtIndex:[indexPath row]]];

    // Add this
    UILabel *menge = (UILabel *)[cell viewWithTag:100]; 
    // As cell may have been reused menge already many have some value. 
    // Initialize menge with an appropriate value
    menge.text = @"";

   return cell;

}