Незважаючи на те, що Interface Builder знає про це MyClass
, я отримую помилку під час запуску програми.
Це відбувається, коли MyClass
це частина бібліотеки, і не відбувається, якщо я компілюю клас безпосередньо в цілі програми.
Незважаючи на те, що Interface Builder знає про це MyClass
, я отримую помилку під час запуску програми.
Це відбувається, коли MyClass
це частина бібліотеки, і не відбувається, якщо я компілюю клас безпосередньо в цілі програми.
Відповіді:
Незважаючи на помилку " Невідомий клас MyClass у програмі Interface Builder. ", Надруковану під час виконання, ця проблема не має нічого спільного з Interface Builder, скоріше з компонувальником, який не пов'язує клас, оскільки жоден код не використовує його безпосередньо.
Коли дані .nib (зібрані з .xib) завантажуються під час виконання, MyClass
посилаються за допомогою рядка, але лінкер не аналізує функціональність коду, просто існування коду, тому він цього не знає. Оскільки жоден інший вихідний файл не посилається на цей клас, лінкер оптимізує його поза існуванням під час створення виконуваного файлу. Отже, коли Apple намагається завантажити такий клас, він не може знайти пов'язаний з ним код і друкує попередження.
За замовчуванням цілі Objective-C будуть -all_load -ObjC
встановлені за замовчуванням прапори, які зберігатимуть усі символи. Але я почав із цілі C ++, і цього не мав. Тим не менш, я знайшов спосіб цього, який тримає лінкер агресивним.
Злом, який я спочатку використовував, полягав у тому, щоб додати порожню статичну процедуру, наприклад:
+(void)_keepAtLinkTime;
що нічого не робить, але що я б зателефонував один раз, наприклад:
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
Це змусить лінкер утримувати весь клас, і помилка зникає.
Як зазначив jlstrecker у коментарях, нам не потрібно дійсно додавати _keepAtLinkTime
метод. Просто зателефонувавши до існуючого, наприклад:
[MyClass class];
виконує трюк (поки ви походите з NSObject
).
Звичайно, ви можете зателефонувати цьому в будь-якому місці вашого коду. Я думаю, це може бути навіть недосяжний код. Ідея полягає в тому, щоб обдурити лінкер в думці, яке MyClass
використовується десь, щоб воно не було таким агресивним в оптимізації.
Швидке визначення погляду. Обов’язково переотримайте init(coder aDecoder: NSCoder)
. Об'єктивне-C визначення контролера перегляду. І, нитка в грушевому дереві.
Додати ім'я модуля до інспектора деталей Nib, де ви вибираєте свій клас.
MyClass
. Просто викличте метод, який він успадковує NSObject
, наприклад +class
.
MyClass.m
в розділі Цільове членство Інспектора файлів.
Я вирішив це відповідно до того, що запропонувала Лаура, але мені не потрібно було відтворювати файли.
Використовуючи XCode 4, у Навігаторі проекту виберіть файл .m, який містить клас, на який він скаржиться
Перейдіть до пункту Перегляд-> Утиліти-> Показати інспектор файлів
(це покаже Файловий інспектор праворуч із інформацією про файл .m)
Відкрийте розділ Цільове членство та переконайтесь, що для цього .m-файлу вибрано цільову ціль
Коли я додав свій файл .m до свого проекту, він чомусь не додав його до моєї цілі за замовчуванням, і це призвело до того, що я отримав помилку, яку ви згадали.
Це насправді не має нічого спільного з Interface Builder, що тут відбувається - символи не завантажуються з вашої статичної бібліотеки Xcode. Щоб вирішити цю проблему, вам потрібно додати -all_load -ObjC
прапори до Other Linker Flags
ключових параметрів збірки Project (і, можливо, цільової).
Оскільки Objective-C генерує лише один символ для кожного класу, ми повинні змусити лінкер також завантажувати членів класу, використовуючи прапор -ObjC, і ми також повинні змусити включити всі наші об'єкти з нашої статичної бібліотеки, додавши -all_load
прапор лінкера. Якщо пропустити ці прапори рано чи пізно, ви зіткнетеся з помилкою unrecognized selector
або отримаєте інші винятки, наприклад, той, який ви спостерігали тут.
-ObjC
прапор фіксував його в моєму випадку.
-ObjC
досить добре для вирішення проблеми.
Я зіткнувся з цією проблемою сьогодні за допомогою Swift.
Я змінив клас Model.h + Model.m
на а Model.swift
. Цей об'єкт використовувався в Interface Builder з class = Model
.
Як тільки я замінив об'єкт, клас більше не міг завантажуватися.
Що я повинен був зробити, це змінити посилання на клас в IB:
Class = Model
Module =
до
Class = Model
Module = <TARGETNAME>
Ви знайдете <TARGETNAME>
в налаштуваннях збірки. Це також ім'я відображається у створеному Swift-Header:#import "TARGETNAME-Swift.h"
Module
ім’я було саме там, у спадному списку. Це була назва мого додатка.
Перейдіть до "ProjectName", натисніть на нього, а потім перейдіть на вкладку "Фази збірки", а потім натисніть на "компілювати джерела", а потім натисніть кнопку "+", з'явиться вікно, виберіть "MyClass. m "файл і натисніть" додати ",
Створіть проект та запустіть його, проблема, безумовно, буде вирішена
Це проблема кешу Xcode4, просто видаліть усі папки в розділі / Користувачі / Ваш_користувач / Бібліотека / Підтримка програм / iPhone Simulator / 4.3 / Програми /
Крім того, якщо у вас є те саме тестування проблем на вашому iPhone, видаліть старий додаток перед його запуском ...
Удачі. Паскуаль
Іноді IBuilder пропускав customModule="AppName" customModuleProvider="target"
Щоб виправити це, відкрийте раскадровку як вихідний код і замініть цей рядок:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">
до цього:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
customModule="MyFrameworkName"
. Величезні +10
Мій випадок - намагаючись використовувати клас зі швидкої рамки в моєму об'єктивному проекті c, я отримав цю помилку. Рішення полягало в тому, щоб додати модуль (швидкий фреймворк) класу в програму Interface builder / Storyboard, як показано нижче. Більш нічого
Перейдіть до Фаз збірки-> Зберіть джерела та додайте нові .m файли.
У моєму випадку вона показувала помилку для класу, який навіть не існував! Я підозрював, що це щось забилося у файлі розкадрівки. Якщо ви не розпізнаєте файл класу в помилці, спробуйте це:
1) відкрийте свій проект у піднесеному чи іншому хорошому редакторі. Пошук класу, на який посилаються. 2) видаліть цілий шматочок, який говорить
customClass="UnrecognizedClassName"
3) збережіть його. 4) поверніться до xcode та очистіть проект, і спробуйте запустити його зараз.
працював на мене.
customClass="MyCla"
). Замість того, щоб видаляти призначене для користувача класове призначення, для мене було доцільним просто ввести клас, який я мав намір використовувати в першу чергу :)
Я просто хочу додати цю відповідь, оскільки більшість, якщо не всі відповіді тут, припускають, що клас існує насправді .. це просто те, що лінкер / компілятор занадто німий, щоб його бачити .. таким чином, відповіді обертаються навколо або сповіщають лінкера про існування класу або створення хака, щоб «змусити» його існувати ..
моя проблема трапляється, коли це повідомлення насправді говорить про неіснуючий клас .. тож прикладом може бути повернення мене до старої редакції git , яка не знає певного класу .. все ж компілятор скаржиться, що зазначений клас не відповідає ' t існують ..
рішення?
вам слід добре піти за цим
Найкращий спосіб усунення помилки: 1) Виберіть файл класу (.m) 2) у розділі " Цільове членство ", "перевірте" запис назви проекту
Я це виправив, скопіювавши текст із моїх class.h та .m, видаливши ці файли класів із проекту та створивши нові файли class.h та .m з тим самим іменем за допомогою "Додати файл". Потім я вставив код назад у нові файли, і все працювало чудово. Колись файли не були пов’язані правильно, коли вони були створені. Після цього мені не потрібно було використовувати жодних прапорців.
Я НАРЕШНО виправив це, я забув додати наступний код у свій .m файл:
@implementation MyTableViewCell
@end
Отже, це було викликано тому, що я створив заповнювач @interface для своєї комірки таблиці, який мав з'єднання з елементом у файлі .xib, але в програмі Interface Builder є помилка, якщо для класу не вказано @implementation, він не може його знайти.
Я пройшов усі кроки з інших форумів, коли розглядав .xib як джерело і бачив MyTableViewCell, хоча я прокоментував це з мого коду. Я спробував скинути тренажер. Я навіть намагався розбити всі свої класи на окремі файли, названі так само, як інтерфейси, але до цього нічого не вийшло.
З мого досвіду PS, не має значення, чи назви файлів .h / .m відрізняються від імен інтерфейсу @interface. У мене є кілька файлів, що містять більше одного інтерфейсу, і вони прекрасно працюють.
PPS У мене є більш детальне пояснення того, чому UITableViewCell і UICollectionViewCell викликають цю помилку за адресою https://stackoverflow.com/a/22797318/539149, а також як виявити її під час компіляції за допомогою registerClass: forCellWithReuseIdentifier :.
Це трапляється тому, що .xib отримав усталене посилання на старий делегат додатків, який вже не існує. Я це зафіксував так:
Я спробував це та інші відповіді, перелічені на цьому веб-сайті, жодна з яких не сортувала його для мене. Ці коментарі (з http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) допомогли:
Після пошуку та пошуку та пошуку я нарешті виявив ім’я цього видаленого класу, прихованого у файлі. Мені довелося відкрити файли конструктора інтерфейсу в X-коді, клацнувши правою кнопкою миші та обравши «переглянути як вихідний код». Потім пошуки його придумали
<object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string> <string>*this was the class name*</string>
Просто видалення останнього рядка, на жаль, не виправить це, поскаржившись, що у файлі неправильна кількість елементів. Вам потрібно видалити відповідний рядок у розділі рядків над ним, на який посилається CustomClass
.
У моєму випадку у мене є XCode6, вказаний файл .m класу опиняється в неправильному місці у фазі збірки - він повинен був знаходитись у джерелах компіляції , але в кінці
Не тільки в налаштуваннях проекту, але і в налаштуваннях Target також потрібно додати прапор -all_load -ObjC ..
Core-Plot: невідомий клас CPLayerHostingView у файлі Interface Builder
Ця проблема, схоже, не застаріла.
У мене була та сама проблема з Xcode 8 і вона вирішила аналогічно, як смайлик :
Відкрийте файл розкадровки як "Вихідний код" у межах Xcode:
Шукайте клас, на який посилаєтесь, і видаліть цілий біт, який пише
customClass = "НерозпізнанийClassName"
Я мав "Невідомий клас favouritesButton у файлі Interface Builder" і відслідковував його до сцени книжок із розповідями, де у відповідній кнопці був фіктивний спеціальний клас "favouritesButton" у полі Class у верхній частині інспектора ідентичності. Я мав намір поставити це значення в наступне поле: Ідентифікаційний знак.
Зміна цього на "UIButton" вирішила проблему.
Я зіткнувся з цим у Свіфті.
Переміщення файлу .xib у папку Base.lproj проекту позбулося цієї помилки.
Цю помилку я вирішив сьогодні при перетворенні програми aaLuminate в Universal під Xcode 4. Ця програма заснована на шаблоні утиліти і спочатку була побудована під Xcode 3.
Щоб заощадити час, я скопіював iPhone Main та Flipside Views у відповідні назви програми Universal. У мене виникла помилка "Невідомий клас x у файлі Interface Builder". У моєму випадку це не було нічого у файлах або цілях XIB.
Я також скопіював файл aaLuminate-Info.plist з інших причин - для цього було встановлено стару клавішу "Основне ім'я файлу основи", встановлену в MainWindow.
Як тільки я видалив цей ключ, він усунув проблему!
У моєму випадку я отримав цю помилку, оскільки намагався зберегти деяку роботу, створивши новий проект, а потім видаливши декілька вихідних файлів та скопіювавши з однойменних вихідних файлів з робочого проекту. Я також скопіював свій файл MainStoryBoard, який шукав мого RootViewController. Однак, коли я видалив початковий RootViewController, а потім додав його до попереднього продукту RootViewController, очевидно, що операція Додати файли не змогла "встановити" прапорець, як було запропоновано вище. Лише переглядаючи всі імпортовані файли ".m" Newley та переконуючись, що прапорець призначений для членства, все було добре. Я думаю, що сталося те, що файл розкадровки шукав клас, який був "виключений" із посилання, оскільки цільове членство не було перевірено. Переконайтесь, що потрібні файли для цілі так позначені для цільового членства в інспекторі файлів зробив свою справу. Дякую Пат! (Дивись вище)
У моєму випадку це було тому, що я оголосив підклас підкласу комірки UITableView у файлі .h (декларація обох підкласів знаходився в одному .h-файлі), але забув зробити пусту реалізацію цього другого підкласу .m файл.
не забудьте реалізувати будь-який підклас підкласу, який ви заявляєте у файлі .h! звучить просто, але легко забути, тому що Xcode зробить це для вас, якщо ви працюєте з одним класом на .h / .m файл.
У мене був "Невідомий клас RateView в Builder інтерфейсів", де RateView був підкласом UIView. Я скинув UIView на сцену розгортки і змінив поле класу Custom на RateView. І все-таки ця помилка з’явилася.
Для налагодження я змінив ім’я свого класу на RateView2 і змінив всі посилання на відповідність, крім поля спеціального класу UIView. Повідомлення про помилку все ще з'являлось, як і раніше, у RateView як відсутній клас. Це підтвердило, що повідомлення про помилку було пов’язане зі значенням поля класу Custom. Я змінив це значення на RateView2, а повідомлення про помилку змінив на "Невідомий клас RateView2 в Interface Builder". Прогрес роду.
Нарешті, я перевірив самі файли вихідного коду в File Inspector. Там я виявив, що файл вихідного коду (який я скопіював із підручника) не асоціювався з моєю цільовою метою. Іншими словами, у нього не було цільового членства. Я встановив прапорець, у якому файл вихідного коду класу був членом цільової програми, і повідомлення про помилку відійшло.
У моєму випадку я видалив клас під назвою "viewController", не розуміючи, що його було обрано інспектором ідентичності розкладової дошки (під "Спеціальним класом" вгорі).
Вам просто потрібно вибрати правильний клас для контролера перегляду в полі "Спеціальний клас" інспектора особистості або додати новий клас до свого проекту та вибрати його як власний клас.
Працювали для мене!
Я додав файл "Фаза збірки" в "Цілі" і проблему було вирішено. Про кроки додати файл дивіться мою відповідь за адресою:
Це трохи наштовхнуло мене, і жодна з наведених вище пропозицій не допомогла мені позбутися помилки. На щастя, у мене був лише один об’єкт IB за допомогою класу, тому я просто видалив його та додав назад із тим самим вказаним класом. Помилка пішла ...