Пользовательская ячейка в UITableView не работает должным образом в темном режиме iOS 13

С 2011 года я использую код Objective-C для своего медицинского приложения, которое в основном имеет 5 вкладок со связанными UITableViews, в 3 из которых используются настраиваемые ячейки. Первоначально при использовании темного режима я обнаружил, что пользовательские ячейки не переходят в темный режим автоматически. Вместо этого мне нужно было реализовать приведенный ниже код, чтобы протестировать темный режим и внести соответствующие изменения в текст ячейки и фон.

Проблема в том, что изменения темного режима не происходят для пустых ячеек на первой вкладке, выше или ниже заполненных ячеек; они остаются пустыми белыми. Однако аналогичные пустые ячейки в UITableViews, связанных со вторыми двумя вкладками, ДЕЙСТВИТЕЛЬНО ведут себя, как ожидалось, в темном режиме.

На примерах изображений ниже показаны ячейки, отображаемые на первой и третьей вкладках. В этот момент мне интересно, есть ли ошибка в ОС или я просто не реализую правильные изменения, чтобы объяснить, почему темный режим не работает должным образом только на первой вкладке.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier "; 

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier]; 
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        for (id oneObject in nib)
            if ([oneObject isKindOfClass:[CustomCell class]])
                cell = (CustomCell *)oneObject;
    } 

    NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];

    cell.calculationLabel.text = [dictionary objectForKey:@"Title"];
    [cell.calculationLabel setLineBreakMode:NSLineBreakByWordWrapping];
    cell.calculationLabel.numberOfLines = 0;

    //Make color changes in cells relevant to Dark mode, if present.
    if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { //Dark mode
        cell.calculationLabel.textColor = [UIColor whiteColor];
        cell.calculationLabel.backgroundColor = [UIColor blackColor];
        cell.statusLabel.backgroundColor = [UIColor blackColor];
        cell.favoriteStatus.backgroundColor = [UIColor blackColor];
        cell.backgroundColor = [UIColor blackColor];
    } else { //Light mode
        cell.calculationLabel.textColor = [UIColor blackColor];
        cell.calculationLabel.backgroundColor = [UIColor whiteColor];
        cell.statusLabel.backgroundColor = [UIColor whiteColor];
        cell.favoriteStatus.backgroundColor = [UIColor whiteColor];
        cell.backgroundColor = [UIColor whiteColor];
    }

    cell.statusLabel.textColor = [UIColor systemGreenColor];

введите описание изображения здесь

введите описание изображения здесь


person user183804    schedule 13.09.2019    source источник


Ответы (1)


Вам нужно использовать правильные цвета, те, которые автоматически адаптируются между светлым и темным режимами.

Избегайте таких цветов, как whiteColor и blackColor. Используйте labelColor и systemBackgroundColor. Используйте эти цвета для ячеек и представления таблицы. Тогда вам не нужно иметь код, проверяющий текущие черты или стиль интерфейса.

Такой код, как:

if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { //Dark mode
    cell.calculationLabel.textColor = [UIColor whiteColor];
    cell.calculationLabel.backgroundColor = [UIColor blackColor];
    cell.statusLabel.backgroundColor = [UIColor blackColor];
    cell.favoriteStatus.backgroundColor = [UIColor blackColor];
    cell.backgroundColor = [UIColor blackColor];
} else { //Light mode
    cell.calculationLabel.textColor = [UIColor blackColor];
    cell.calculationLabel.backgroundColor = [UIColor whiteColor];
    cell.statusLabel.backgroundColor = [UIColor whiteColor];
    cell.favoriteStatus.backgroundColor = [UIColor whiteColor];
    cell.backgroundColor = [UIColor whiteColor];
}

становится:

cell.calculationLabel.textColor = UIColor.labelColor;
cell.calculationLabel.backgroundColor = UIColor.systemBackgroundColor;
cell.statusLabel.backgroundColor = UIColor.systemBackgroundColor;
cell.favoriteStatus.backgroundColor = UIColor.systemBackgroundColor;
cell.backgroundColor = UIColor.systemBackgroundColor;
person rmaddy    schedule 13.09.2019
comment
Я заменил предоставленный вами код, но, к сожалению, он воспроизвел то же поведение в темном режиме, которое я пытаюсь решить. То есть незанятые части tableview остаются белыми, но только под первой вкладкой. Незанятое пространство табличного представления соответственно становится черным на второй и третьей вкладках приложения в темном режиме с использованием того же кода, что и табличное представление на первой вкладке. - person user183804; 14.09.2019
comment
Вам нужно установить фон для табличного представления, а не только для ячеек. - person rmaddy; 14.09.2019
comment
Спасибо за помощь! Незанятые части tableview теперь окрашены соответственно в белый или черный цвет, в зависимости от статуса темного режима, с помощью этого добавленного кода: self.tableView.backgroundColor = [UIColor systemBackgroundColor]; - person user183804; 14.09.2019