0

ある期間のイベントを表示する*UITableView、ある種のカレンダーがあります。各セクションは曜日で、各イベントはカスタム *UITableViewCellです。イベントは の中にあり*NSArray、日付と時刻に応じて、これらのイベントはテーブルの 1 つのセクションに割り当てられます。

セクション内の行数は問題ありませんが、セルが表示されると、一部のセルが他のセクションの他のセルでコンテンツを繰り返し始め、情報を上書きします。また、このセルには割り当てられた色があり、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

まず、CalendarDayCell *cell を .h ファイルに作成し、セル オブジェクトを再利用します。次に、 cellForRowAtIndexPathに新しい値を設定する前に Nil を設定します。たとえば、設定

cell.label.text = @"";

cell.imageview.image = ゼロ;

次に、必要なテキストを設定します。didSelectRowAtIndexPathと同じで、新しい色を設定する前に、まず次のようにクリア カラーを設定します。

cell.container.backgroundColor = [UIColor clearColor];

cell.container.backgroundColor = bgColor;

それはあなたを助けるかもしれません。

于 2015-07-03T08:42:30.813 に答える