我正在为应用程序处理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以重新加载。这可能吗?
答案 0 :(得分:1)
您可以查看此存储库:https://github.com/Draveness/DKNightVersion
在UITableView+Night.m
中,它取代了sectionIndexBackgroundColor
,sectionIndexColor
的设置者。
答案 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