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

4 に答える 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];

ビューに他のラベルがある場合は、それらを配列に保存して、それらだけを削除できます

于 2012-08-09T14:27:51.923 に答える
2

アプリが変更されたことを認識して再描画できるように、setNeedsDisplay を呼び出す必要があります。

- (void)setNeedsDisplay
于 2012-08-09T13:42:59.403 に答える
2

あなたのupdateLabelsメソッドは実際にUILabelは毎回新しいコントロールを作成しているため、古いコントロールの「上に」表示されます。これはあなたが望んでいるものではないと思いますが、完全に明確ではないので、あなたがやろうとしていることを誤解していたら申し訳ありません.

私がそれについて正しければ、UILabelおそらくあなたのviewDidLoadまたは類似のコントロールを一度だけ作成してください。次に.text、タイマーが起動したときにプロパティを設定するだけです。

于 2012-08-09T14:01:34.160 に答える
1

ラベルの clearsContextBeforeDrawing プロパティを YES に設定します

これは、コードだけでなく nib からも設定できます。

label.clearsContextBeforeDrawing = YES;
于 2012-08-09T14:06:42.020 に答える