iOS7 NSKeyedArchiver 警告:替换键“UITintColor”的现有值;类层次结构中的编码键可能重复
Posted
技术标签:
【中文标题】iOS7 NSKeyedArchiver 警告:替换键“UITintColor”的现有值;类层次结构中的编码键可能重复【英文标题】:iOS7 NSKeyedArchiver warning: replacing existing value for key 'UITintColor'; probable duplication of encoding keys in class hierarchy 【发布时间】:2014-01-23 16:52:16 【问题描述】:我使用 xib 创建了一个 uitableviewcell。而且我有一个单元工厂,其中单元以这种方式未归档:
- (instancetype)initWithNib:(NSString *)aNibName
self = [super init];
if (self != nil)
self.viewTemplateStore = [[NSMutableDictionary alloc] init];
NSArray * templates = [[NSBundle mainBundle] loadNibNamed:aNibName owner:self options:nil];
for (id template in templates)
if ([template isKindOfClass:[UITableViewCell class]])
UITableViewCell * cellTemplate = (UITableViewCell *)template;
NSString * key = cellTemplate.reuseIdentifier;
if (key)
[self.viewTemplateStore setObject:[NSKeyedArchiver archivedDataWithRootObject:template] forKey:key];
else
@throw [NSException exceptionWithName:@"Unknown cell"
reason:@"Cell has no reuseIdentifier"
userInfo:nil];
return self;
- (UITableViewCell *)cellOfKind:(NSString *)theCellKind forTable:(UITableView *)aTableView
UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:theCellKind];
if (!cell)
NSData * cellData = [self.viewTemplateStore objectForKey:theCellKind];
if (cellData)
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData];
else
DDLogError(@"Don't know nothing about cell of kind %@", theCellKind);
return cell;
如果将 UIActivityIndicatorView 添加到单元格中,则此消息会出现在控制台中:
* NSKeyedArchiver 警告:替换键 'UITintColor' 的现有值;类中的编码键可能重复 层次结构
它只发生在 ios7 中。 UIActivityIndicatorView 有默认值,我只是将它拖放到单元格上。
关于为什么会出现此消息的任何线索?
谢谢。
【问题讨论】:
【参考方案1】:这是iOS7中引入的一个bug。
您正在调用[NSKeyedArchiver archivedDataWithRootObject:template]
,这会导致整个视图层次结构被归档(使用过程encodeWithCoder:
)。
导致警告的问题是UIActivityIndicatorView
是UIView
的子类,它也符合<NSCoding>
协议。在 iOS7 之前,Navigation Bar、Activity Indicator 等视图都有其 Tint 属性,但在 iOS7 中,Tint 属性存在于 UIView
本身中。所以 UIViewActivityIndicator 和它的祖先 UIView 都在为UITintColor
键编码这个 Tint 属性,首先它由UIView
设置,然后被UIActivityIndicatorView
覆盖。这就是出现此警告的原因。不用担心。
顺便说一句,你为什么用这么奇怪的代码来生成单元格? 您可以在 viewDidLoad 中将所有的重用标识符注册到适当的 Nib:
[self.tableView registerNib:[UINib nibWithNibName:@"Cells" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"cell1"];
然后当你调用时tableView本身会加载一个单元格
[tableView dequeueReusableCellWithIdentifier:@"cell1" forIndexPath:indexPath];
【讨论】:
以上是关于iOS7 NSKeyedArchiver 警告:替换键“UITintColor”的现有值;类层次结构中的编码键可能重复的主要内容,如果未能解决你的问题,请参考以下文章
用mansard对cell的子控件设置约束,并且自动计算cell高度的问题,ios7警告
Xcode 中针对 iOS 7 部署目标的 LaunchImage 警告