2016-11-25 3 views
0

Я работаю над темным режимом для приложения. Основная предпосылка для переключения, позволяющая пользователям переключаться между темным и световой режимами.глобально обновить все uitableviewcell

Я пытаюсь найти лучший способ обновить все UITableViewCell's. IE в «светлом режиме» цвет фона ячеек является белым, а темный цвет фона ячеек темным.

В настоящее время я достичь этого с помощью

- (void) tableView: (UITableView *) tableView 
    willDisplayCell: (UITableViewCell *) cell 
forRowAtIndexPath: (NSIndexPath *) indexPath 
{ 
    if(darkMode) 
    { 
     cell.backgroundColor  = darkBackground; 
     cell.textLabel.textColor = darkTextColor; 
    } 
    else 
    { 
     cell.backgroundColor  = lightBackground; 
     cell.textLabel.textColor = lightTextColor; 
    } 
} // End of tableView:willDisplayCell:forRowAtIndexPath: 

Проблема заключается в том, когда пользователь переключается из темного/света я хочу, чтобы все ячейки перерисовывать так, что фон обновляются. Я могу сделать это на основе таблицы, вызвав отдельного пользователя uitableviewreloaddata, но я хочу, чтобы в приложение было загружено КАЖДОЕ табличное представление, загруженное в приложение. Это возможно?

+0

копаться в 'UIAppearance' класса –

+0

Проблема с' UIAppearance' это метки. Например, ячейка может содержать как textLabel, так и detailLabel, которые обычно не должны быть одного цвета. Я не верю, что UIAppearance может помочь в этом. – Kyle

+0

Вы можете создать свой собственный подкласс UITableViewCell, который соответствует UIAppearance и пометить пользовательский сеттер с помощью UI_APPEARANCE_SELECTOR. –

ответ

0

Моим решением в настоящее время является swizzle UITableView и добавление обработчика уведомлений. Я не уверен, что это будет моя окончательная реализация, поскольку я все еще расследую. Быстрый код выглядит примерно так:

#import <JRSwizzle.h> 

@implementation UITableView (Swizzle) 

+ (void) load 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     NSError *error = nil; 

     const SEL deallocSel = NSSelectorFromString(@"dealloc"); 

     BOOL result = 
      [[self class] jr_swizzleMethod: @selector(initWithFrame:style:) 
           withMethod: @selector(initSQLProWithFrame:style:) 
            error: &error]; 

     if (!result || error) 
     { 
      NSLog(@"Can't swizzle methods - %@", [error description]); 
     } 

     result = 
      [[self class] jr_swizzleMethod: @selector(initWithCoder:) 
           withMethod: @selector(initSQLProWithCoder:) 
            error: &error]; 

     if (!result || error) 
     { 
      NSLog(@"Can't swizzle methods - %@", [error description]); 
     } 

     result = 
      [[self class] jr_swizzleMethod: deallocSel 
           withMethod: @selector(SQLProDealloc) 
            error: &error]; 

     if (!result || error) 
     { 
      NSLog(@"Can't swizzle methods - %@", [error description]); 
     } 
    }); 
} 

- (instancetype) initSQLProWithFrame: (CGRect)frame 
           style: (UITableViewStyle) style 
{ 
    self = [self initSQLProWithFrame: frame 
           style: style]; 

    if(self) 
    { 
     NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; 

     [nc addObserver: self 
       selector: @selector(themeChanged) 
        name: [SQLProAppearanceManager apperanceUpdatedNotificationName] 
       object: nil]; 

    } // End of self 

    return self; 
} // End of initSQLProWithFrame:style: 

- (instancetype) initSQLProWithCoder: (NSCoder*) coder 
{ 
    self = [self initSQLProWithCoder: coder]; 

    if(self) 
    { 
     NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; 

     [nc addObserver: self 
       selector: @selector(themeChanged) 
        name: [SQLProAppearanceManager apperanceUpdatedNotificationName] 
       object: nil]; 
    } // End of self 

    return self; 
} // End of initSQLProWithCoder: 

- (void) themeChanged 
{ 
    [self reloadData]; 
} // End of themeChanged 

- (void) SQLProDealloc 
{ 
    NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; 

    [nc removeObserver: self 
        name: [SQLProAppearanceManager apperanceUpdatedNotificationName] 
       object: nil]; 

    [self SQLProDealloc]; 
} // End of SQLProDealloc 

@end 
0

Вы можете проверить состояние darkMode в каждом контроллере с UITableView в viewWillAppear метод и вызвать reloadData при необходимости

+0

'UITableView' не поддерживает' viewWillAppear'. – Kyle

+0

Это метод контроллера вида –

+0

Да, правильно, но я не использую UITableViewController. Просто UITableView. Эти два не просто взаимозаменяемы. – Kyle

Смежные вопросы