全局更新所有uitableviewcell

时间:2016-11-25 15:46:37

标签: ios uitableview

我正在为应用程序处理Dark模式。具有切换功能的基本前提是允许用户在黑暗模式和轻模式之间切换。

我试图找出更新所有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:

问题是,当用户从黑暗/光线切换时,我希望重绘所有单元格,以便更新背景。我可以通过调用单个uitableview reloaddata在每个表基础上执行此操作,但我希望已在应用程序中加载每个tableview以重新加载。这可能吗?

3 个答案:

答案 0 :(得分:1)

您可以查看此存储库:https://github.com/Draveness/DKNightVersion

UITableView+Night.m中,它取代了sectionIndexBackgroundColorsectionIndexColor的设置者。

答案 1 :(得分:0)

您可以使用UITableView方法viewWillAppear检查每个控制器中的darkMode状态,并在需要时调用reloadData

答案 2 :(得分:0)

我目前的解决方案是调配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