@IBDesignable - @IBInspectable, класс, а не ключевое значение, совместимый с кодированием

У меня внезапно возникает странная и воспроизводимая ошибка при использовании класса @IBDesignable, свойства @IBInspectable выдают следующее предупреждение:

Main.storyboard: warning: IB Designables: Игнорирование определенного пользователем атрибута времени выполнения для ключевого пути «test» в экземпляре «UIButton». Попадание в исключительную ситуацию при попытке установить его значение: [setValue: forUndefinedKey:]: этот класс не соответствует кодированию значения ключа для ключевого теста.

Чтобы быть ясным, это предупреждение является проблемой только в Xcode, оно отлично упаковывается. Все еще раздражает!

Действия по воспроизведению

  1. Создать новый проект
  2. Создайте собственный подкласс @IBDesignable UIButton со свойством @IBInspectable String:

    import UIKit
    
    @IBDesignable
    class TempButton: UIButton {
        @IBInspectable var test:String = ""
    }
    
    1. Drag a Button to a View Controller in the storyboard, and give it the custom class "TempButton" in the Identity Inspector.
    2. Теперь атрибут «Test» должен появиться в инспекторе атрибутов для свойств «Temp Button» - введите что-нибудь в это поле.
    3. Бац! Появится указанное выше предупреждение. Удалите текст из поля, и предупреждение исчезнет.

Я пробовал несколько решений - разные имена переменных, делая свойство test необязательным, используя инициализатор, пока не повезло.

Вот снимок экрана с проблемой:

введите описание изображения здесь


person Craig Grummitt    schedule 15.10.2015    source источник
comment
Очень интересно, и я не могу воспроизвести проблему. Я сделал именно то, что ты сказал. Никаких предупреждений. Какую версию Xcode вы используете? Вы не забыли сначала собрать приложение? Компьютер перезагружать не пробовали (помогает Xcode по голове шлепнуть)?   -  person matt    schedule 15.10.2015
comment
Я ударил Xcode по голове (т.е. перезагрузился!), И я пробовал его как на текущей версии Xcode (7.0.1), так и на бета-версии (7.1 beta 3), не повезло. Спасибо, что изучили это, интересно, что это происходит не для вас.   -  person Craig Grummitt    schedule 15.10.2015
comment
Добавили снимок экрана, чтобы помочь диагностировать проблему, если другие люди не могут ее воспроизвести.   -  person Craig Grummitt    schedule 15.10.2015
comment
Хороший снимок экрана. Я вижу важную разницу в нашем опыте: после того, как вы перетащите кнопку и измените ее класс, ваш Designables читает Updating, а мой читает Up to date. Несомненно, это ключевое отличие. - Ты как обычно сдуваешь тайники, фу?   -  person matt    schedule 15.10.2015
comment
Интересное наблюдение, вы правы, зависает на "Обновление". Я очистил и перестроил проект, создал новые проекты, и проблема продолжает возникать - есть ли другие предложения по этому «сдутию кешей»?   -  person Craig Grummitt    schedule 15.10.2015
comment
Как я объясняю здесь: stackoverflow.com/a/6247073/341994 Конечно, никаких гарантий, но всегда стоит попробовать.   -  person matt    schedule 15.10.2015
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Craig Grummitt    schedule 15.10.2015
comment
Тебе повезло с этим Крейгом? Я только что потратил еще один день на размышления об особенностях xcode.   -  person amergin    schedule 12.11.2015
comment
Привет @amergin, в конце концов мне пришлось отказаться от использования IBInspectable, что было большой проблемой. Я думал, что я единственный человек, терпящий, как вы сказали, эту разочаровывающую идиосинкразию Xcode. Я просмотрел все предложения Мэтта по очистке кешей и т. Д., И ничего не помогло.   -  person Craig Grummitt    schedule 13.11.2015
comment
FWIW, я испытываю эту ошибку только с UIButtons   -  person odyth    schedule 02.01.2017


Ответы (4)


Я исправил это, убедившись, что в «сборке» Interface Builder не было ошибок. Вот что это значит:

  1. На левой панели Xcode перейдите в навигатор отчетов (последний элемент вкладки вверху).
  2. В списке Reporst после ваших целей вы должны увидеть «Interface Builder». Разверните этот элемент.
  3. Убедитесь, что ни один из элементов не содержит ошибок (обозначенных красным крестиком).
  4. Если вы обнаружите здесь ошибку, выберите ее, и вы увидите более подробную информацию о проблеме. Устраните эту проблему, очистите и восстановите.

Обратите внимание, что проблема, вероятно, не связана с файлом, с которым вы работаете. Похоже, что если сборка Interface Builder завершится неудачно, прежде чем она доберется до сборки рассматриваемого файла, вы увидите эти очень загадочные предупреждения.

(Моя причина в том, что цель расширения общего доступа неправильно ссылается на каталог ресурсов AppIcon и SplashScreen.)

person MikecheckDev    schedule 12.01.2016
comment
Ага! Это означает, что мне нужно вставить @available в классы, специфичные для iOS9 + ... и иметь дело со старыми версиями. Так много работы, чтобы просто правильно загрузить раскадровку. WTH. - person nekonari; 05.05.2016
comment
Закройте Xcode. Очистите папку DerivedData /Users/..../Library/Developer/Xcode/DerivedData и выполните сборку заново. - person Everton Cunha; 12.07.2016

У меня та же проблема, и я ее решил. Открыв раскадровку: 1 нажмите Редактор в верхнем меню. Дважды нажмите Обновить все представления. 3-перезапустите ваше приложение. 4-сборка.

person Zaki Al Karam    schedule 25.11.2016
comment
это сработало и для меня на 8.2.1. Мне пришло в голову, что я недавно отключил автоматическое обновление представлений при работе в автономном режиме, чтобы сэкономить заряд батареи, так что, возможно, проблема возникла из-за этого, а также из-за того, что представления не обновлялись в последнее время. - person Natalia; 24.03.2017

У меня была аналогичная проблема, но я не нашел решения в ответах выше. В моем случае в Инспектор идентичности по ошибке был добавлен дополнительный keyPath:

введите описание изображения здесь

person Stefo    schedule 21.04.2020
comment
Я потратил два дня на изучение того, как создавать собственные представления с помощью xib с устаревшей онлайн-документацией Apple. По этому сложному пути я собираю много проб (также с переименованием свойств), и, кажется, некоторые из них добавят атрибуты «ключ-значение» в разных местах, как вы упомянули. После протирания всех неправильных элементов - онтопные сообщения исчезают. Спасибо. - person A. Petrov; 16.02.2021

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

Пришлось сменить:

@property (nonatomic) IBInspectable BOOL *randomProp;

to:

@property (nonatomic) IBInspectable BOOL randomProp;
person Raimundas Sakalauskas    schedule 21.05.2020