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

Изведнъж получавам странна и възпроизводима грешка, когато използвам клас @IBDesignable, свойствата @IBInspectable дават следното предупреждение:

Main.storyboard: предупреждение: 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. Сега атрибутът „Тест“ трябва да се появи в инспектора на атрибутите за свойствата на „Временен бутон“ - въведете каквото и да е в това поле.
    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 чете Актуализиране, но моят чете Актуализиран. Със сигурност това е основната разлика. - Направихте ли обичайното издухване на кешовете?   -  person matt    schedule 15.10.2015
comment
Интересно наблюдение, прав си, виси на 'Updating'. Почистих и изградих наново проект, създадох нови проекти и проблемът продължава да се появява - някакви други предложения за това „издухване на кешовете“?   -  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. В списъка с отчети, след вашите цели, трябва да видите „Interface Builder“. Разширете този елемент.
  3. Уверете се, че нито един от елементите няма грешки (както е обозначено с червения X).
  4. Ако намерите грешка тук, изберете я и ще видите повече подробности за проблема. Поправете този проблем, почистете и изградете отново.

Имайте предвид, че проблемът вероятно не е свързан с файла, в който работите. Изглежда, че ако изграждането на Interface Builder се провали, преди да стигне до изграждането на въпросния файл, ще видите тези много загадъчни предупреждения.

(Каузата ми в крайна сметка беше цел за споделяне на разширение, препращаща неправилно към каталог с активи на AppIcon и SplashScreen.)

person MikecheckDev    schedule 12.01.2016
comment
Гах! Това означава, че трябва да вмъкна @available в класове, които са специфични за iOS9+... и да се справя с по-стари версии. Толкова много работа, за да се зареди правилно Storyboard. WTH. - person nekonari; 05.05.2016
comment
Затворете Xcode. Изчистете папката DerivedData /Users/..../Library/Developer/Xcode/DerivedData и изградете отново. - person Everton Cunha; 12.07.2016

Изправен съм пред същия проблем и го реших. Докато сте отворени сценария: 1 щракнете върху Редактор в горното меню. 2-щракнете върху Опресняване на всички изгледи. 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. По този труден начин събирам много изпробвания (също с преименуване на свойство) и изглежда, че някои от тях ще добавят атрибути ключ-стойност на различни места, както споменахте. След изтриване на всички грешни елементи - ontopic съобщенията изчезват. Благодаря. - 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