Как я могу это исправить: «этот класс не совместим со значением ключа для представления изображения ключа»? - PullRequest
1 голос
/ 03 июля 2019

Я близок к концу перевода своего кода из Objective-C в Swift, и я начал переключать классы контроллера представления в Swift. Мне удалось исправить большинство проблем с контроллерами представления, но я продолжаю получать эту ошибку для одного из моих контроллеров представления.

При сбое: "Thread 1 signal sigabrt"

Журнал ошибок:

Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIViewController 0x7fd98fc65ee0> setValue:forUndefinedKey:]: 
this class is not key value coding-compliant for the key background.'

Примечание: в этом случае "background" - это выход UIImageView.

Я прошел через несколько стековых решений, и ни одно из них мне не помогло. Я пробовал:

  • Очистка папки сборки

  • Удаление приложения на симуляторе

  • Удаление производной папки

  • Проверка на наличие дополнительных IBOutlets

  • Удаление и повторное подключение соединений

  • Переименование розетки

  • Проверка дополнительных соединений в раскадровке

  • Отладка функции viewDidLoad ()

Вот мой код:

IBOutlet var background: UIImageview!

override func viewDidLoad() {
    super.viewDidLoad()

    let image: UIImage = UIImage(named: UserDefaults.standard.string(forKey: "Background")!)!
    background.image = image
    ...
}

1 Ответ

3 голосов
/ 03 июля 2019

Проблема выявляется в сообщении об ошибке:

[UIViewController 0x7fd98fc65ee0> setValue:forUndefinedKey:]:

Таким образом, вам нужно установить класс этого контроллера представления в раскадровке для класса реального контроллера представления, который имеет свойство background.

По всей вероятности, вы уже правильно установили это, но оно работало только в Objective-C. Если вы зайдете в инспектор Identity и удалите класс, нажмете return, а затем снова войдете в класс и нажмете return, вы увидите, что теперь инспектор Identity видит, что мы должны получить этот класс из модуля Swift, и все начнет работать в Swift.

По сути, основной причиной является, вероятно, искажение имени Свифта. Класс Objective C под названием MyClass действительно называется MyClass, но класс Swift с именем MyClass не является. При удалении имени и повторном его вводе Objective-C показывает новое имя класса.

...