如何在iOS中以编程方式更新UILabel

3

我在更新标签时遇到了问题...它不会删除旧值,所以新值会覆盖旧值...如果您能提供帮助,将不胜感激...

timer = [NSTimer scheduledTimerWithTimeInterval:1
                                         target:self
                                       selector:@selector(updateLabels)
                                       userInfo:nil
                                        repeats:YES];

-(void) updateLabels{
    for (GraphView *graph in arr){
        // retrieve the graph values
        valLabel = [[UILabel alloc] initWithFrame:CGRectMake(i * 200, 0, 90, 100)];
        valLabel.textColor = [UIColor whiteColor];
        valLabel.backgroundColor = [UIColor clearColor];
        valLabel.text = [NSString stringWithFormat:@"Value: %f", x];
        i++;
    }        
}
4个回答

5
如果您设置标签的文本,就不需要调用setNeedsDisplay或clearContext等方法。
在您的代码中,我不知道您的变量i和x是什么?
主要问题是您正在创建并添加新标签到视图中。当您调用updateLabels方法时,可能会导致内存泄漏。简单地说,您有n次标签重叠。
在创建和添加新标签之前,您需要删除这些标签,或者您可以重复使用已经存在的标签。如果要重复使用标签,则需要将它们保存到数组中并更新文本。
如果您想创建新标签,除非您的视图中还有其他标签,否则可以像这样做。
-(void) updateLabels{
// remove all labels in your view   
for (UIView *labelView in self.view.subviews) {
    if ([labelView isKindOfClass:[UILabel class]]) {
    [labelView removeFromSuperview];
}

for (GraphView *graph in arr){
    // retrieve the graph values
    valLabel = [[UILabel alloc] initWithFrame:CGRectMake(i * 200, 0, 90, 100)];
    valLabel.textColor = [UIColor whiteColor];
    valLabel.backgroundColor = [UIColor clearColor];
    valLabel.text = [NSString stringWithFormat:@"Value: %f", x];
    i++;
}        
}

当您创建新的标签时,需要将它们作为子视图添加到您的视图中。
[self.view addSubview: valLabel];

如果您的视图中有其他标签,那么您可以将它们保存在一个数组中,然后只删除它们。

我遇到了一个错误..它说`UIView没有声明'removeFromSuperView'选择器。 - user123
应该是 removeFromSuperview。只是打错了。我也修正了我的答案。 - Mert

2

您需要调用setNeedsDisplay,以便应用程序知道它已更改并重新绘制它。

- (void)setNeedsDisplay

它类似于 [valLabel setNeedsDisplay]; 吗? - user123
1
如果您设置UILabel的文本,它会自动重新绘制。您不需要调用setNeedsDisplay。 - Mert

2
您的updateLabels方法实际上每次都会创建新的UILabel控件,因此它们将仅简单地显示在旧控件的上方。我猜这不是您想要的,尽管如果我误解了您的意图,那么我很抱歉。
如果我对此正确,那么只需在viewDidLoad或类似位置创建一次您的UILabel控件。然后,当计时器触发时,只需设置它们的.text属性即可。

是的,你说得对。我以前会在viewDidLoad方法中创建它们,但如果我有多个标签,只有最后一个标签才能被更新。我不知道如何解决这个问题。 - user123
如果屏幕上有许多标签,您可以将标签分配给标签,例如 valLabel.tag=i。如果我误解了您要做的事情,请谅解。 - Sreeram
当您在viewDidLoad方法中创建它们时,需要在类中保留对每个UILabel对象的引用。可以使用数组来存储所有这些UILabel对象。如果您只保留单个UILabel引用,则只能更改最后一个。 - Martin

1
将您的标签的clearsContextBeforeDrawing属性设置为YES。
您可以从nib或代码中进行设置。
label.clearsContextBeforeDrawing = YES;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接