Xcode - Как исправить «NSUnknownKeyException», причина:… этот класс не соответствует значению ключа, кодирующему ошибку «X»?

Как насчет этого решения?

Просто добавьте атрибут данных «data-type = editable» в тег изображения следующим образом:


И сценарий к вашему проекту выкл ...

function init() {
    $("img[data-type=editable]").each(function (i, e) {
        var _inputFile = $('')
            .attr('type', 'file')
            .attr('hidden', 'hidden')
            .attr('onchange', 'readImage()')
            .attr('data-image-placeholder', e.id);

        $(e.parentElement).append(_inputFile);

        $(e).on("click", _inputFile, triggerClick);
    });
}

function triggerClick(e) {
    e.data.click();
}

Element.prototype.readImage = function () {
    var _inputFile = this;
    if (_inputFile && _inputFile.files && _inputFile.files[0]) {
        var _fileReader = new FileReader();
        _fileReader.onload = function (e) {
            var _imagePlaceholder = _inputFile.attributes.getNamedItem("data-image-placeholder").value;
            var _img = $("#" + _imagePlaceholder);
            _img.attr("src", e.target.result);
        };
        _fileReader.readAsDataURL(_inputFile.files[0]);
    }
};

// 
// IIFE - Immediately Invoked Function Expression
// https://stackoverflow.com/questions/18307078/jquery-best-practises-in-case-of-document-ready
(

function (yourcode) {
    "use strict";
    // The global jQuery object is passed as a parameter
    yourcode(window.jQuery, window, document);
}(

function ($, window, document) {
    "use strict";
    // The $ is now locally scoped 
    $(function () {
        // The DOM is ready!
        init();
    });

    // The rest of your code goes here!
}));

См. демонстрацию в JSFiddle

1112
задан 23 revs, 14 users 38% 16 July 2019 в 04:55
поделиться

5 ответов

Ваш контроллер представления может иметь неправильный класс в вашем xib.

Я скачал ваш проект.

Вы получаете ошибку

'NSUnknownKeyException', причина: '[ setValue: forUndefinedKey:]: этот класс не соответствует кодированию значения ключа для строки ключа.'

Это вызвано Вторым контроллером представления в MainWindow.xib , имеющим класс UIViewController вместо SecondView . Переход на правильный класс решает проблему.

Между прочим, в Objective-C использовать имена типа «строка» - плохая практика. Это вызывает конфликт именования во время выполнения. Избегайте их даже в разовых приложениях. Коллизии имен очень сложно отследить, и вы не хотите тратить время зря.

Другая возможная причина этой ошибки: при копировании и вставке элементов из одного контроллера в другой Xcode каким-то образом сохраняет эту ссылку на исходный контроллер даже после редактирования и повторной привязки этого элемента к новому контроллеру.

Другая возможная причина этой ошибки:

Плохой выход.

Вы либо удалили , либо переименовали имя торговой точки в файле .h .

Удалите его в инспекторе подключений файла .xib или .storyboard .

947
ответ дан 19 December 2019 в 20:15
поделиться
  1. Вам нужно указать IBOutlet только один раз, метка IBOutlet для вашего ivar не нужна.
  2. Создаете ли вы экземпляр своего NIB с помощью UIViewController ? В какой-то момент вы должны позвонить [SecondView initWithNibName: @ "yourNibName" bundle: nil];
30
ответ дан 19 December 2019 в 20:15
поделиться

Еще одна «несовместимая» проблема, которую я обнаружил, заключалась в том, что мне по какой-то причине удалось получить две копии класса.

Я добавлял ключи не к той копии. Интерфейсный разработчик все еще видел ключи и позволял мне подключиться к ним, но во время выполнения он использовал другую копию класса, у которой не было новых ключей.

Чтобы найти «правильную» копию, я использовал команду XCode, щелкнув имя класса в другом месте, чтобы перейти к правильной копии, затем я удалил плохие неиспользуемые копии (после переноса моих правок из неиспользованной копии первый).

Мораль истории: дублировать файлы классов - это плохо.

7
ответ дан 19 December 2019 в 20:15
поделиться

Я получил ту же ошибку, когда я вручную загрузил представление из пера. Оказывается, что я забыл устанавливать владельца представления.

Для, например, Если Вы загружаете представление следующим образом,

 let view = Bundle.main.loadNibNamed("MyNibFileName",
                                 owner: nil,
                                 options: nil)?.first as! UIView

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

Зафиксируйте: Присвойте владельцу для представления.

 let view = Bundle.main.loadNibNamed("MyNibFileName",
                                 owner: self,
                                 options: nil)?.first as! UIView
0
ответ дан 19 December 2019 в 20:15
поделиться

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

у меня есть другой подмодуль в моем проекте, и я называю новый класс с тем же именем с другим классом в основном модуле, мой новый класс НЕ имеют xib файл (100% кодом), но другой класс в основном модуле имеют xib файл. Я думаю XCode, связанный неправильно новый класс с xib файлом в основном модуле.

, Что причина катастрофического отказа с сообщением:

this class is not key value coding-compliant for the key tableView.

0
ответ дан 19 December 2019 в 20:15
поделиться