0

我有一个*UITableView显示一段时间内的事件,某种日历。每个部分都是一周中的一天,每个事件都是自定义 *UITableViewCell的。这些事件在一个*NSArray中,并且根据它们的日期和时间,这些事件被分配到表的一个部分。

部分中的行数很好,但是当显示单元格时,其中一些开始在其他部分的其他单元格中重复其内容,从而覆盖其信息。此外,此单元格具有指定的颜色,并且在didSelectRowAtIndexPath单击时其背景更改为该颜色的方法,但与上述相同,其他部分的其他单元格也会更新其背景颜色。

我认为这与细胞重用有些相关,但我找不到我做错了什么。

PD:我是 iOS 新手,所以请随时询问更多代码、纠正我等。感谢您的建议。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CalendarDayCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CalendarDayCell"];

    if (cell == nil) {
        NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"CalendarDayCell" owner:self options:nil];        
        cell = [nibs objectAtIndex:0];
    }

    CalendarEvent *ce = self.events[indexPath.row];
    NSString *initHr = [self formatDateGetHour: ce.timestart];
    ... sets cell info ...
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...
    UIColor *bgColor = [self lighterColorForColor:[self colorWithHexString:ce.color]];
    CalendarDayCell *cell = (CalendarDayCell *)[_calendarTable cellForRowAtIndexPath:indexPath];
    cell.container.backgroundColor = bgColor;
    ...
}

这是我如何为部分中的行进行计算

- (void) calculateRowsInSections
{
    mondayEventsCount = 0, tuesdayEventsCount = 0, wednesdayEventsCount = 0, thursdayEventsCount = 0, fridayEventsCount = 0, saturdayEventsCount = 0, sundayEventsCount = 0;

    if (self.events.count) {
        for (CalendarEvent* ce in self.events) {
            if ([self getDayOfWeek : ce.timestart] == 2) mondayEventsCount++;
            else if ([self getDayOfWeek : ce.timestart] == 3) tuesdayEventsCount++;
            else if ([self getDayOfWeek : ce.timestart] == 4) wednesdayEventsCount++;
            else if ([self getDayOfWeek : ce.timestart] == 5) thursdayEventsCount++;
            else if ([self getDayOfWeek : ce.timestart] == 6) fridayEventsCount++;
            else if ([self getDayOfWeek : ce.timestart] == 7) saturdayEventsCount++;
            else if ([self getDayOfWeek : ce.timestart] == 1) sundayEventsCount++;
        }       
    }
}

正在发生的事情的一些图像:

第 1 天 星期一

第 2 天 星期二

4

2 回答 2

0

看起来您应该-prepareForReuse在自定义单元格类中实现方法并在那里清理单元格的内容。https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewCell_Class/#//apple_ref/occ/instm/UITableViewCell/prepareForReuse

也代替

if (cell == nil) {
    NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"CalendarDayCell" owner:self options:nil];        
    cell = [nibs objectAtIndex:0];
}

最好在-viewDidLoad方法注册单元格:

[self.tableView registerNib:[UINib nibWithNibName:@"CalendarDayCell" bundle:nil] forCellReuseIdentifier:@"CalendarDayCell"];
于 2015-07-03T08:37:30.430 回答
0

首先,在 .h 文件中创建 CalendarDayCell *cell 并重用单元对象。第二件事,在cellForRowAtIndexPath设置新值之前设置 Nil 。例如集

单元格.label.text = @"";

cell.imageview.image = 无;

然后设置您想要的文本。与didSelectRowAtIndexPath相同,在设置新颜色之前,首先设置清晰的颜色,如:

cell.container.backgroundColor = [UIColor clearColor];

cell.container.backgroundColor = bgColor;

它可能会帮助你。

于 2015-07-03T08:42:30.813 回答