Копирование UIButton с использованием unarchivedObjectOfClass - объект не может быть нулевым - PullRequest
0 голосов
/ 25 сентября 2019

Для копирования UIButton это работает:

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

Однако, начиная с iOS 12.0, NSKeyedUnarchiver устарел.Но при попытке описанного ниже newButton имеет значение nil.

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:btn requiringSecureCoding:nil error:nil];    
// unarchivedObjectOfClass shows error - couldn't be read because it isn't in correct format?
NSError *error = nil;
UIButton *newButton = [NSKeyedUnarchiver unarchivedObjectOfClass:[UIButton class] fromData:archivedData error:&error];    
[originalBtnsArray addObject:newButton]; // Fails here as newButton is nil

. Обратите внимание (перед любым рассмотрением дублирования), что класс объекта не является массивом, и поэтому метод unarchivedObjectOfClass (singular)желательно.Также нет специальной кодировки!

Как я могу использовать unarchivedObjectOfClass для копирования UIButton?

Спасибо.

1 Ответ

0 голосов
/ 25 сентября 2019

Из документов ,

Убедитесь, что вы приняли NSSecureCoding в типах, которые вы декодируете.Если какой-либо вызов метода с префиксом декодирования завершается неудачно, defaultodingDailFileurePolicy устанавливает ошибку, а не вызывает исключение.В этом случае текущий и все последующие вызовы декодирования возвращают 0 или ноль.

Чтобы декодирование работало, вам необходимо адаптировать безопасное кодирование, указав requireSecureCoding YES.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...