更新UITableViewCell上的标签

时间:2013-12-12 18:49:49

标签: ios objective-c uitableview

我有一个NSTimer每四秒调用一次这个方法:

- (void)timerDecrement
{
    timerCount = timerCount-1;  
    [OtherViewControllerAccess updateTimeLeftLabel];  
}

在另一个班级的updateTimeLeftLabel中:

- (void)updateTimeLeftLabel
{
    int timeLeft = OtherClassAccess.timerCount;

    UILabel *timeLeftLabel = [[UILabel alloc] initWithFrame:CGRectMake(200, 10, 120, 20)];
    timeLeftLabel.text = [NSString stringWithFormat:@"Tid kvar: %ih", timeLeft];
    [cell addSubview:timeLeftLabel];
}

基本上我希望我的应用程序使用当前时间更新tableview中单元格中的标签,但上述方法对调用没有任何作用。所以我的问题是,如何将此子视图添加到cellForRowAtIndexPath:委托方法之外的单元格中,然后在每次调用该方法时更新该标签。

5 个答案:

答案 0 :(得分:3)

  

所以我的问题是,如何将此子视图添加到外部的单元格中   cellForRowAtIndexPath:委托方法,然后让它更新   每次调用方法时都会标记。

答案是,不要将子视图添加到cellForRowAtIndexPath之外的表视图单元格中。单元格属于表格视图,绝对,绝对不应该尝试修改它们。这是表视图的工作。

正如您的代码出现问题的一个小例子,您将向表格视图单元格添加越来越多的标签视图,每1/4秒添加一个。那很糟糕。

第二点:哪个细胞是“细胞”?表视图管理整个单元格表。如果用户滚动,则某些单元格将在屏幕外滚动并替换为不同的单元格。

相反,您应该确定哪个indexPath包含包含数据的单元格,更改模型中的数据,并告诉表视图在适当的indexPath处更新单元格。这将导致它重新绘制更新的内容。

答案 1 :(得分:3)

以下是我做类似的事情。我创建了一个自定义UITableViewCell类,它有一个时间戳UILabel:

@property (nonatomic) UILabel *labelTimestamp;

在该单元格的layoutSubviews中,我根据标题更新标签大小。

- (void)layoutSubviews {
    [super layoutSubviews];
    [self.labelTimestamp sizeToFit];
    ...
}

然后我在我的UIViewController中每分钟都会触发一个NSTimer,它会在每个可见单元格中更新该标签(您可以适应只更新一个具有特定indexPath的单元格)。

- (void)timerDidFire
{
    NSArray *visibleCells = [self.tableView visibleCells];
    for (GroupViewCell *cell in visibleCells) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        [cell.labelTimestamp setText:[self.groupController statusUpdateDateAtIndexPath:indexPath]];
        [cell setNeedsLayout];
    }
}

答案 2 :(得分:2)

我会将单元格的设置集中在cellForRowAtIndexPath:方法中。您可以继续使用NSTimer来调用reloadRowsAtIndexPaths:withRowAnimation:以及要更新的单元格/单元格的索引,从而再次调用cellForRowAtIndexPath:

答案 3 :(得分:0)

为什么不在变量中放置该值(要在单元格中显示)并为该值指定UILabel。在updateTimeLeftLabel中,只需致电[self.tableView reloadData]

答案 4 :(得分:0)

您可以重新加载整个表或某些特定行,但这需要将数据源与您的视图连接。您必须先更改数据集,然后必须调用

[self.tableview reloadData]; 

另一种方法是,在更改数据集调用之后

[self.tableview reloadRowsAtIndexPaths:indexPath withAnimation:animation];

第二种方法需要indexPath,即您知道需要编辑哪个单元格。 我的问题是一样的。在我的项目中,每个单元格中有2个TextFields和1个标签。现在,根据2个文本字段的值,我必须在UILabel中显示它们的乘法。这是我的代码。

-(void)textFieldDidChange:(id)sender{
    UITextField *_sender = (UITextField *)sender;
    int tag = _sender.tag;
    int row = tag / 3;

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
    ((UILabel *)[[self.tableView cellForRowAtIndexPath:indexPath] viewWithTag:row * 3 + 2]).text = @"hello";
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"here");
    static NSString *CellIdentifier = @"procedureDetailsCell";
    UITableViewCell *cell = (procedureCell *)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if ( cell == nil ) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [((procedureCell *)cell).Quantity setTag:indexPath.row + 0];
    [((procedureCell *)cell).Quantity addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

    [((procedureCell *)cell).Cost setTag:indexPath.row + 1];
    [((procedureCell *)cell).Cost addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

    [((procedureCell *)cell).total setTag:indexPath.row + 2];

    return cell;
}

逻辑很简单我使用了Custom TableViewCell,它包含2个文本字段和1个标签。当两个文本字段的值中的一个被更改时,我们正在调用" textFieldDidChange"找到索引路径然后找到UITableViewcell然后更新其lastview的文本值的方法,即我们的UILabel。我们必须为每个视图提供唯一标记。