iPhone - TableViewCellを再利用する

私のiPhoneアプリでは、カスタムセルでUITableViewを使用しています。これらのセルには、主にテキストのみを表すさまざまなラベルが含まれています。しかし、私は別の色を与えることによって、何らかの種類のステータスインジケータとしてラベルの1つを使用しています。 スクロールがかなり遅くなったので、私は細胞を再利用したかったのです。そうすることでパフォーマンスは向上しますが、「ステータスラベル」は正しく表示されません。異なるセルの色はもう正しくありません(他のすべてのラベルは正しい)。

誰もがこのような問題を経験して、私にヒントを与えることができますか?

編集: カスタムテーブルセルのコード

- (void)setIncident:(Incident *)_incident{
[self setSelectionStyle:UITableViewCellEditingStyleNone];
incident = _incident;

streamNameLbl.text = incident.streamName;
jobNameLbl.text = incident.jobName;
workInProgressByLbl.text = incident.workInProgressBy;
NSDateFormatter *tempFormatter = [[NSDateFormatter alloc] init];
[tempFormatter setDateFormat:@"hh:mm"];
errorTimeLbl.text = [NSString stringWithFormat:@"%@", [tempFormatter stringFromDate:incident.errorTime]];

[tempFormatter setDateFormat:@"dd. MMM"];
plandateLbl.text = [NSString stringWithFormat:@"%@", [tempFormatter stringFromDate:incident.planDate]];

returnCodeLbl.text = [@"RC: " stringByAppendingString: incident.returnCode];
runNumberLbl.text = [@"Run: " stringByAppendingString: incident.runNumber];
severityLbl.text = incident.severity;
restartStatusLblValue.text = incident.restartStatus;

    NSString * color = incident.severityColor;
    NSString * colorR = [color substringWithRange:NSMakeRange(1, 2)];
    NSString * colorG = [color substringWithRange:NSMakeRange(3, 2)];
    NSString * colorB = [color substringWithRange:NSMakeRange(5, 2)];

    unsigned intColorR = 0;
    unsigned intColorG = 0;
    unsigned intColorB = 0;

    NSScanner *scanner = [NSScanner scannerWithString:colorR];
    [scanner scanHexInt:&intColorR];
    scanner = [NSScanner scannerWithString:colorG];
    [scanner scanHexInt:&intColorG];
    scanner = [NSScanner scannerWithString:colorB];
    [scanner scanHexInt:&intColorB];

    incidentStatusLbl.backgroundColor = [UIColor clearColor];

    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = incidentStatusLbl.bounds;
    gradient.startPoint = CGPointMake(0, 0.5);
    gradient.endPoint = CGPointMake(1, 0.5);
    UIColor * startColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    UIColor * endColor = [UIColor colorWithRed:intColorR/255.0 green:intColorG/255.0 blue:intColorB/255.0 alpha:1];
    gradient.colors = [NSArray arrayWithObjects:(id)[startColor CGColor], (id)[endColor CGColor], nil];

    [incidentStatusLbl.layer insertSublayer:gradient atIndex:0];
}

UITableViewのcellForRowAtIndexPath

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

incidentCell = (IncidentCell *)[tableView dequeueReusableCellWithIdentifier:@"IncidentCell"];
if (incidentCell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"IncidentCell" owner:self options:nil];
    incidentCell = [nib objectAtIndex:0];
     NSLog(@"Loading cell from xib file");
    }
else{
    NSLog(@"Reusing cell");    
     }

NSMutableArray *sectionDetails = ((NSMutableArray *)[incidentDic objectForKey:[self.sortedSections objectAtIndex:[indexPath section]]]);

Incident *incident = [sectionDetails objectAtIndex:[indexPath row]];

[incidentCell setIncident:incident];

return incidentCell;
}
0
いくつかのコードを見せてください。
追加された 著者 rckoenes,

1 答え

セルを再利用するとき、セルが - (UITableViewCell *)で尋ねられると、tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath たとえば、ラベルの色を黒色で黒色に設定し、コード内で行うと

if (some_condition) {
   cell.myLabel.textcolor= myStatusColor;
}

ラベルにmyStatusColor色が1回あると、ラベルを再利用するときにラベルが保持されます。

だからあなたはする必要があります

if (some_condition) {
   cell.myLabel.textcolor= myStatusColor;
} else {
   cell.myLabel.textcolor= [UIColor black];
}

In fact your problem come from [incidentStatusLbl.layer insertSublayer:gradient atIndex:0];

一度使用すると、subLayer(subLayer1と呼ぶ)があります。セルを再利用する場合は、別のサブレイヤをインデックス0、BEHIND subLayer1に追加します。以前のカスタムサブレイヤーを削除することをお勧めします。

3
追加された
さて、私の答えを編集します。
追加された 著者 Zoleas,
(私の最初の投稿を編集しました)私が理解していないものは、ラベルのテキストではなく、カラーではないのですか?私はiPhoneの開発には不慣れです。
追加された 著者 Pathos,
非常に素晴らしい、ありがとう、それは働いた。あまりにもこの質問が私の評判を下げて悪い^^
追加された 著者 Pathos,