我有一个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:
委托方法之外的单元格中,然后在每次调用该方法时更新该标签。
答案 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。我们必须为每个视图提供唯一标记。