集合查看单元格表现异常

时间:2017-07-18 05:01:01

标签: ios objective-c uicollectionviewcell reuseidentifier

我有一个单元格,其中我在顶部有两个标签,然后是中间的视图和底部的两个标签,它是一个图形。我已经对项目数量进行了硬编码,因为我只需要10-13个值,显然一切都很好,值正在更新,并且子视图被添加到cellForRowAt委托方法中但滚动时标签的值显示为空白,并且这种行为是非常不正常的,因为滚动时如果第二和第三个索引变为空白,那么在进一步滚动时它们会返回并且第7个第5个变为空白,因为没有服务调用所以我没有调用重载数据。这绝对让我发疯,我知道它与细胞被重复使用时有关,但我不知道为什么或者我做错了什么,因为最初价值看起来很好。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
TraingingGraphCollectionViewCell *cell = (TraingingGraphCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:[NSString stringWithFormat:@"TraingingGraphCollectionViewCell"] forIndexPath:indexPath];

if (indexPath.row == 0 || indexPath.row == 12) {

    [cell initEmptyCell];
} else {

    [cell initCellWithMaximumWeight:100 completedWeight:10*(int)indexPath.row maxRepititions:10 completedRepititions:(int)indexPath.row];
}

return cell;    
   }     

以下是委托方法中调用的方法。 `

-(void) initEmptyCell {
 //    [self setNeedsDisplay];

// back ground colour
self.backgroundColor = UIColorFromRGB(COLOUR_232323);

//hiding the labels
[self.completedWeightLabel setHidden:YES];
[self.completedRepititonsLabel setHidden:YES];
[self.dateLabel setHidden:YES];
[self.setLabel setHidden:YES];
}

这是下面给出的第二种方法

-(void) initCellWithMaximumWeight:(float)maxWeight
              completedWeight:(float)completedWeight
               maxRepititions:(int)maxRepititions
         completedRepititions:(int)completedRepititions {

//reloading the content
//[self setNeedsDisplay];


// back ground colour
self.backgroundColor = UIColorFromRGB(COLOUR_232323);

// adding the weight bar
float weightPercentage = completedWeight / maxWeight;
if (weightPercentage > 1) {
    weightPercentage = 1;
}
UIView *weightView = [[UIView alloc] initWithFrame:CGRectMake(20.0, self.graphView.frame.size.height - (self.graphView.frame.size.height * weightPercentage), 10.0, self.graphView.frame.size.height * weightPercentage)];
[weightView setBackgroundColor:UIColorFromRGB(COLOUR_E9280E)];
[self.graphView addSubview:weightView];

// adding the repititions bar
float repsPercentage = (float)completedRepititions / (float)maxRepititions;
if (repsPercentage > 1) {
    repsPercentage = 1;
}
UIView *repsView = [[UIView alloc] initWithFrame:CGRectMake(35.0, self.graphView.frame.size.height - (self.graphView.frame.size.height * repsPercentage), 10.0, self.graphView.frame.size.height * repsPercentage)];
[repsView setBackgroundColor:UIColorFromRGB(COLOUR_97F619)];
[self.graphView addSubview:repsView];

//bottom view
[self.dateLabel setAttributedText:[NSString stringWithFormat:@"%@", [Utilities convertDateToString:[NSDate date] usingFormat:dd__MM_DATE_FORMAT forCulture:@"nl_NL"]] withFont:FontUsingMacro(LATO_BOLD_FONT_STRING, 12.0) kerining:1.3 color:UIColorFromRGB(COLOUR_FFFFFF)];
[self.setLabel setAttributedText:[NSString stringWithFormat:@"Set 01"] withFont:FontUsingMacro(LATO_BOLD_FONT_STRING, 12.0) kerining:1.3 color:UIColorFromRGB(COLOUR_808080)];

//top view
[self.completedWeightLabel setAttributedText:[NSString stringWithFormat:@"%.1f KG", completedWeight] withFont:FontUsingMacro(LATO_REGULAR_FONT_STRING, 12.0) kerining:1.3 color:UIColorFromRGB(COLOUR_E9280E)];
[self.completedRepititonsLabel setAttributedText:[NSString stringWithFormat:@"%d Reps", completedRepititions] withFont:FontUsingMacro(LATO_REGULAR_FONT_STRING, 12.0) kerining:1.3 color:UIColorFromRGB(COLOUR_97F619)];


}

2 个答案:

答案 0 :(得分:1)

当单元格出现在屏幕上时,即使没有重新加载,

staticfiles也会被调用。所以说索引0处的单元格的值为A.然后滚动,0处的单元格离开屏幕。索引8处的单元格显示为值B.当您向后滚动以查看索引0处的单元格时,表格视图可能会重复使用索引8处的单元格。现在索引0处的单元格将显示B(如果您未将其设置回正确值)索引0处数据的值。遵循?

当您在cellForItem中发表声明时,通常会发生这种情况:

cellForItem

然后你不编码else条件。

所以请确保你这样做:

if foo {
    cell.textLabel.text = "isFoo"
}

<强>更新

现在我看到了你的代码,这正是你所做的。您可以在if语句中设置隐藏的标签,而不要在else语句中取消隐藏它们。

答案 1 :(得分:1)

initCellWithMaximumWeight 方法中包含以下代码。

[self.completedWeightLabel setHidden:NO];
[self.completedRepititonsLabel setHidden:NO];
[self.dateLabel setHidden:NO];
[self.setLabel setHidden:NO];