首页 > 解决方案 > 如何使用 NSKeyedArchiver 在 iOS 中复制按钮

问题描述

要复制一个按钮,这一直工作正常:

   NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: btn];
   UIButton *newButton = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];

但是从 iOS12 开始,这已被弃用。但是使用建议的方法会导致 newButton 为零。我做错了什么或者确实有另一种方法来复制 UIButton。完整代码:

// Init originalBtnsArray and
originalBtnsArray = [[NSMutableArray alloc]init];

// Populate originalBtnsArray
for (UIButton *btn in btnsReferencesArray){
    // Below works but is now deprecated as of iOS 12
    //NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: btn];
    //UIButton *newButton = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];

    NSError* error = nil;
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:btn requiringSecureCoding:NO error:&error];

    NSError* unArchiveError = nil;
    UIButton *newButton = [NSKeyedUnarchiver unarchivedObjectOfClass:[UIButton class] fromData:archivedData error:&unArchiveError];

    // newButton is nil, which is suboptimal
    [originalBtnsArray addObject:newButton];
}

标签: iosobjective-c

解决方案


现在开始工作了:

UIButton *newButton = [[UIButton alloc]init];
newButton.frame = btn.frame;
[originalBtnsArray addObject:newButton];

推荐阅读