2017-02-11 12 views
0

У меня есть Пользователь Class, который использует метод saveuser() всякий раз, когда приложение завершается. Пользователь имеет два Arrays пользовательского Classes того подкласса NSObject. Вот мой метод кодирования.Кодировать массив с NSCoder

func encode(with aCoder: NSCoder) { 
    aCoder.encode(self.firstName, forKey: coderKey.fName) 
    aCoder.encode(self.lastName, forKey: coderKey.lName) 
    aCoder.encode(self.bio, forKey: coderKey.bio) 
    aCoder.encode(self.tags, forKey: coderKey.tags) 
    aCoder.encode(self.organizations, forKey: coderKey.orgs) 
    aCoder.encode(self.img, forKey: coderKey.img) 
} 

Приложение прекращает работу при кодировании self.tags. Я предполагаю, что он будет делать то же самое с self.organizations, потому что он также является arrayNSObjects и, возможно, с self.img, потому что это UIImage. Вот ошибка, которую я получаю.

Нагрузочный приложение из-за неперехваченного исключением 'NSInvalidArgumentException', причина: '- [Social_Justice.Tag encodeWithCoder]: непризнанный селектор отправляется например 0x60000005efc0'

Что я должен сделать, чтобы решить эту проблему? Если вам нужно больше увидеть код, просто прокомментируйте и я отредактирую.

+2

Ваши два пользовательских класса также должны реализовать NSCoding. –

ответ

0

как Дэвид Берри прокомментировал исходное сообщение. Вы должны убедиться, что любые пользовательские классы, которые вы пытаетесь кодировать, также соответствуют NSCoder. Им не нужно иметь пути к архивам, они просто должны иметь функции кодирования и декодирования.

0

Ответ:

  1. Я полагаю имя класса объекта внутри массива self.tag s и self.organization ы являются Tag и Организация

  2. Objective-C использует совершенно другой стиль вызова функции. Если вы видите [ClassName/ObjectName methodName], что как-то эквивалентно стилю в Swift, давайте ставим его таким образом на данный момент (компилятор Swift будет лучше в будущем, и, надеюсь, вы больше не увидите предупреждений objctive-C при отладке)

  3. A selector - термин, используемый Objective-C, вы можете подумать, что это метод. Поэтому это непризнанное предупреждение об ошибке выбора указывает, что код попытался вызвать метод с именем encodeWithCode(), который фактически не существует внутри объекта Тег и Организация (система NSCoder знает, как кодировать массив, но не имеет понятия, кодировать собственный объект внутри массива)

  4. Если вы хотите использовать 5 конкретных классов системы NSCoder на объекте, объект MUST соответствует протоколу NSCoding.Это означает, что класс (Tag и организации) должны осуществлять init?(coder: NSCoder) и func encode(with: NSCoder)

  5. 4 конкретный класс NSCoder являются NSArchiver, NSUnarchiver, NSKeyedArchiver, NSKeyedUnarchiver, and NSPortCoder.

Дополнительная литература:

NSCoding/NSKeyed​Archiver By NSHipster

Или: (мой любимый)

Apple Document NSCoder

Apple Document NSKeyedArchiver

Apple Document NSCoding

Или: (Если эти документы все еще немного запутать для вас)

Hollemans М. 2016, учебное пособие по пятому изданию iOS 5 Контрольный список, стр. 126 ~ стр. 137

 Смежные вопросы

  • Нет связанных вопросов^_^