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;

如果将 UIActivityIndi​​catorView 添加到单元格中,则此消息会出现在控制台中:

* NSKeyedArchiver 警告:替换键 'UITintColor' 的现有值;类中的编码键可能重复 层次结构

它只发生在 ios7 中。 UIActivityIndi​​catorView 有默认值,我只是将它拖放到单元格上。

关于为什么会出现此消息的任何线索?

谢谢。

【问题讨论】:

【参考方案1】:

这是iOS7中引入的一个bug。

您正在调用[NSKeyedArchiver archivedDataWithRootObject:template],这会导致整个视图层次结构被归档(使用过程encodeWithCoder:)。

导致警告的问题是UIActivityIndicatorViewUIView 的子类,它也符合<NSCoding> 协议。在 iOS7 之前,Navigation Bar、Activity Indicator 等视图都有其 Tint 属性,但在 iOS7 中,Tint 属性存在于 UIView 本身中。所以 UIViewActivityIndi​​cator 和它的祖先 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”的现有值;类层次结构中的编码键可能重复的主要内容,如果未能解决你的问题,请参考以下文章

解决cocoapods在64位iOS7系统以下的警告问题

用mansard对cell的子控件设置约束,并且自动计算cell高度的问题,ios7警告

Xcode 中针对 iOS 7 部署目标的 LaunchImage 警告

NSURLSession/NSURLConnection HTTP 加载失败和 iOS 9 的其他 AdMob 警告

NSKeyedArchiver 保存啥格式?

iOS 7:不推荐使用“isa”