проблема copyWithZone


Я пытаюсь сделать копию моего подкласса UIViewController, выполнив:

BookViewController *bookVC = [catalogFlatViewController copy];

И у меня есть следующая ошибка:

'-[BookViewController copyWithZone:]: unrecognized selector sent to instance 0x8e5f00'
2 2

2 ответа:

UIViewController не соответствует NSCopying. Если вы хотите сделать копию, вы должны использовать NSCoding:

NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:controller];
UIViewController *newController = [NSKeyedUnarchiver unarchiveObjectWithData:archive];

Если вы добавили новые ivars в контроллер вида, вам придется переопределить методы NSCoding (encodeWithCoder: и initWithCoder:), чтобы сериализовать и десериализовать их правильно. См. Руководство по программированию архивов и Сериализаций .

Кстати, это в основном то, как работает файл nib.

Обратитесь к ответу @Caleb в следующем сообщении:

IOS copyWithZone нераспознанный селектор только при использовании устройства

Ответ Калеба такой же, как под

UIViewController не реализует протокол NSCopying. Если вы реализовали NSCopying в своем собственном подклассе UIViewController, ваш контроллер вида не будет реагировать на -copyWithZone:.

Для получения дополнительной информации: вы можете обратиться к классу UIViewController Ссылка .

Но я бы предложил вам не реализовывать ссылку на протокол NSCopying, так как @RobNapier дал одну из очень приятных и информативных статей в реализация NSCopying (или NSCopyObject () считается вредным)

Надеюсь, это поможет.