Помилка Xcode 6: Невідомий клас у файлі Interface Builder


600

Я перейшов на Xcode 6 beta 4, і тепер моя програма постійно виходить з ладу з повідомленням

Невідомий клас X у файлі Interface Builder.

Він виходить з ладу, тому що нібито Xcode не може знайти мої власні класи, які я пов’язав у своїй дошці розкадрувань, але це показує, що вони пов'язані правильно в інтерфейсі Xcode.

Я впевнений, що все пов'язано правильно. Моїм єдиним варіантом може бути видалення всього файлу розкадровки та початок з нуля, оскільки воно може якось пошкодитися.

Редагувати: Я також хотів би додати, що я спробував очистити, скинути симулятор, зіпсувати фази збірки тощо. Нічого з цього не працює.


Можливий дублікат stackoverflow.com/questions/3416269 / ...
Bouke

1
@ ImreKelényi Ви праві. Це сталося зі мною знову недавно після виконання того, що ви щойно описали.
Епічний байт

Це працює для мене, stackoverflow.com/questions/1725881 / ...
vrunoa

Для мене це був помилковий помилок, налагоджуйте його до елемента керування, доки він не з’явиться; Переглянути Контролер> Інспектор ідентичності> Спеціальний клас> Клас. видаліть, якщо цей клас не визначений.
mavericks

9
БУДЬ ЛАСКА, ЗАПИШИ! Ця "помилка" може бути наслідком різного походження. Якщо прийнята відповідь не працює для вас, тоді рухайтесь вниз і спробуйте наступну відповідь. Правильною відповіддю для моєї ситуації стала 5-а відповідь.
Джексонкр

Відповіді:


1454

Я вирішив це питання під час введення питання. Я подумав, що відповім на моє запитання і залишу його тут для всіх, хто може зіткнутися з цією проблемою під час використання Xcode 6 beta 4.

Щоб вирішити цю проблему, потрібно вибрати кожен із своїх спеціальних об'єктів класу на Дошці розкадрів (сюди входять будь-які власні представлення, навіть самі контролери власного виду).

Потім із вибраними об'єктами відкрийте інспектор посвідчення і під "Спеціальним класом" ви побачите опцію "Модуль". Клацніть всередині текстового поля Модуль і натисніть клавішу Enter.

Це воно! Поточний модуль для всіх моїх користувацьких об'єктів повинен був бути внутрішньо неправильно встановлений у Xcode 6 beta 4. Але візуальних вказівок на це у інспектора не було.

Зауважте, що якщо натиснути клавішу Enter у текстовому полі Модуля не працює, спробуйте вибрати стрілку праворуч та вручну вибрати поточний модуль, а потім очистіть текстове поле та натисніть клавішу Enter. Ви також можете спробувати натиснути клавішу Enter у текстовому полі класу (хоча зазвичай це вирішує іншу проблему).

Ось зображення, щоб зробити речі більш зрозумілими: введіть тут опис зображення


70
Для мене натискання всередині "Модуль" і натискання клавіші не працювали послідовно, але вибір поля "Клас" (і натискання клавіші Enter) завжди робив цю роботу.
Імре Келеній

2
Для мене ціль була встановлена ​​правильно, але клас все ще не з’являвся в IB. Однак я помітив, що файл "Місцезнаходження" показував шлях "Відносно проекту" замість "Відносно групи". Видалення посилання на файл AND групи та повторне додавання її в корінь проекту працювало для мене.
кнл

8
Ого. Дякую за це, я не думаю, що я би там не потрапив інакше. Це вирішило проблему, яка почала виникати після того, як я додав @objc(...)до одного з моїх занять Swift.
ndbroadbent

12
Ця проблема все ще присутня в XCode 7.2. Це рішення спрацювало.
Том Швидкий

3
Це все ще проблема в Xcode 8.3.1 ... така ганьба
Sepehr Behroozi

99

Іноді Xcode пропускали 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">

7
Насправді в моєму випадку мені довелося видалити customModuleProvider, тоді помилка пішла.
Maciej Swic

3
Гільєрмо, все ще відбувається в Xcode станом на кінець березня!
Ед Маннерс

3
@MaciejSwic Видалення customModuleProviderзробив це для мене також, дякую!
Сакібой

1
як щодо файлів xib?
SleepsOnNewspapers

7
Все ще відбувається ... такі речі змушують мене плакати :(
Лука

72

У мене була ця проблема після перейменування швидкого класу. Вирішили це за допомогою директиви @objc:

@objc(ForumTopicListViewController) class ForumTopicListViewController

4
Це зафіксувало це для мене, я мав @objc class Xі перейшов на @objc(X) class Xроботу.
Джо

1
Ви також можете спробувати видалити ваші отримані дані см stackoverflow.com/questions/24039932 / ...
user1760527

Виникла ця проблема після перейменування класу ViewController за замовчуванням у шаблон проекту Single View. Цікаво, яка магія була використана, щоб @objc()директива не була потрібна для "оригінального" класу ViewController ...
Беренд Кляйн Ханевельд,

Я йду протилежною стороною. Я вказав ім'я модуля у файлі Storyboard, але також додав директиву @objc.
WeZZard

1
НЕ працював для мене. :( Рішення назви модуля не працює.
mythicalcoder

64

Проект з декількома цілями

У моєму випадку я працюю над Project з декількома цілями, і питання "спадкувати від Target" не було відмічено. Вибір "успадкувати від цілі" вирішив мою проблему

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


Дякуємо, що опублікували це. Вирішили проблему, яку я бачив дуже швидко.
ДжаредH

У мене була схожа ситуація. (XCode 9.4.1) Я створив додаток для iOS під назвою FilesTestA зі спеціальним UIView під назвою MxFileView (який складався з MxFileView.swift та MxFileView.xib). Потім я додав ще одну ціль: віджет Today ("FilesTestAWidget"). Рішення для використання MxFileView у віджеті: (1) class = "MxFileView"; (2) встановіть прапорець "Спадковий модуль від цілі" (або зніміть його та вручну введіть "FilesTestAWidget"); (3) у цілі програми переконайтесь, що і MxFileView.swift, і MxFileView.xib включають FilesTestAWidget у своє цільове членство.
Kenster999

Це сталося зі мною в новому проекті з шаблону за замовчуванням у Xcode 10.1 (одна ціль програми iOS та 2 тестових цілі). Поставте прапорець для всіх моїх спеціальних контролерів перегляду (і таким чином текст заповнювача був "Немає"). Пройшовши та встановивши прапорець для кожного спеціального контролера перегляду на моїй розгортці, проблема була вирішена.
Мейсон

58

Це працювало для мене ..

Перевірте своє скомпільоване джерело, додано чи не додано цей файл (наприклад; ViewController.m), у моєму випадку файл ViewController не додано, тому він давав мені помилку.

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


@CarmenA Ви додаєте до файлів ".m" лише коли-небудь Compile Sources. Це дійсно правильне (і єдине) рішення для деяких.
Джексонкр

Я спробував кілька інших рішень без удачі. Це зробило трюк. З якоїсь дивної причини одна ціль не вистачила одного вихідного файлу, який мені відповідав.
галактикух

для мене теж. Сталося через те, що деякі отримують рішення конфлікту
Eldhose

46

Це може статися в будь-якому Xcode вище 6.0. Це трапилось зі мною після перейменування деяких класів ViewController у проекті Swift (але, мабуть, це станеться і з Obj-C). Вам просто потрібно відкрити конструктор інтерфейсів, перейти до інспектора ідентичності ViewController, який перейменував свій клас, виберіть клас та натисніть Enter. Це переназначить перейменований клас на вибраний ViewController, а також скине значення модуля, яке втрачається після перейменування класу.

Оновлення для Xcode 8.1 (можливо, також 8.0):

Xcode 8.1 просто виходить з ладу. Просто і дратівливо просто виходить з ладу і нічого не друкується. Я ганявся за тим фантомним крахом протягом години, щоб дізнатися, що це саме та сама річ - непризначений клас у ІБ. Якщо у вас трапляються фантомні збої, спочатку перевірте IB на наявність непризначених класів.


спасибі за це. виявляється, що після вашої пропозиції Xcode оновлює модуль (під класом в IB) від None до Current. Я думаю, що проблема полягає в тому, що просто введення імені без введення вводу не вдається викликати оновлення модуля за допомогою Xcode.
rockiesGrizzly

Це працювало для мене. Я ненавмисно перейменував клас контролера, тому його, очевидно, більше не існувало при завантаженні контролера перегляду.
Litehouse

32

Іноді контролер, який ви надаєте, втрачає цільове членство від поточної програми. У такому випадку натискання клавіші Enter у полі "Модуль" нічого не призведе. Перейдіть до контролера і переконайтесь, що в ньому поточне додаток встановлено цільовим членством.


У цьому і в мені була проблема - кілька цілей призводять до того, що файл класу випадково не включається до цілі, яку я будував.
Райан Креджер

Я об’єднав файли і пропустив це в одній із моїх цілей, чудова відповідь
Бенджамін Хіменес

Добре, злиття pbx порушило цільові значення членства.
система

32

Увімкнення Inherit Module From Targetприйняло правильний цільовий модуль. Це вирішило питання.

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


Підтвердіть. Це допомогло мені вирішити питання.
Chris8447

У мене зазвичай виникає ця проблема, коли я перетворюю контролер перегляду з Objective-C в Swift. Я повторно вводя останній лист і натискаю Enter. Слід також зробити трюк.
DevNebulae

30

Моя відповідь: встановіть спеціальний модуль, рівний назви користувачеві Pod (у моєму прикладі - ім'я користувацького класу), як на скріншоті, який додається

Це рішення призначено для конкретного випадку : для користувацьких класів подань із фреймворку Pod (або Carthage ).

Інфраструктура: XCode8, Swift3

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


18

Я це виправив, роблячи прямо протилежне тому, що запропонував ChikabuZ (хоч дякую, що вказав на це). У файлі розкадровки знайдіть таке:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

і замініть його таким:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" sceneMemberID="viewController">

Я не можу повірити, скільки годин я втрачаю, обходячись помилками у компіляторі Swift та Xcode 6


17

Вибравши відповідне Moduleдля себе, Custom Classя вирішив цю проблему.

Ось :

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


13

Я зіткнувся з цією проблемою в Xcode 8 , щоб вирішити її, мені довелося змінити табло в текстовому редакторі.

Загалом, шукайте свій контроль і видаліть customModuleі customModuleProviderз управління об'єктом.

Зробив для мене хитрість.


Га! Nice hack :)
Vexy

10

У мене була така ж проблема.

У моєму випадку Xcode не додавав мій спеціальний клас до: Target> Phase Build> Compile Source.

Тому я рекомендую вам перевірити, чи є ваш CustomClass.m.

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

Я сподіваюся, що це вам допоможе.


Це те, що трапилося зі мною, і на щастя знайшов вихід! Я приходив сюди, щоб відповісти, але ти був першим. Дякую!!!
Габріель Піффаретті

9

Я зіткнувся з цією проблемою в Xcode 6.1 , коли я зняв Main.storyboard, в LaunchScreen.xibфайл і за замовчуванням ViewControllerкласів з мого проекту.

Я виправив це, видаливши записи Launch Screen Fileта Main Interfaceзаписи зInfo.plist



8

Я гугл скрізь для цього. Жодна відповідь не працює для мене, поки я не зустрів 1 чувака, який попросив мене перенести папку проекту на робочий стіл. Це просто працювало автоматично. Мабуть, якщо у вас є проект проектування папки на багато папок, XCODE насправді ламається.


Я знову отримав цю проблему в Xcode 7 beta 5, оскільки отримав її в Xcode 6 раніше. Цього разу цей метод працює для мене.
Джейк Лін

1
У візуальній студії є аналогічна проблема. Але там ми отримуємо чітке попередження про те, що шлях занадто довгий, і речі не можна додавати чи редагувати. Не впевнений, чи те ж саме з XCODE, але після цього епізоду я зберігаю всі свої проекти або в документах, або на робочому столі, і ніколи більше не виникала ця проблема. Я навіть дав цю пораду тому, хто використовує студію Xamarin, і це також працювало на них ...
VBaarathi

7

Ці кроки працюють для мене.

1) Очистити отримані дані.
2) Видаліть файли .h та .m
3) знову створіть файли .h та .m


Це працювало і для мене. Я навіть змусив це працювати, не очищаючи отримані дані.
jaytrixz

Це працювало для мене, велике спасибі Арвін, але все-таки я не розумію, чому це викликає таку помилку, тому що я раніше нічого не змінював у класі чи в ІБ
Kirtikumar A.

7

Я вирішив це, відкривши свій файл раскадровки як вихідний код і використовуючи команду-F для пошуку мого невідомого класу та видалення асоційованого з ним спеціального класу.


6

Те, що @gfrs сказав правильним, вам потрібно встановити Модуль. Однак я одного разу зіткнувся з проблемою, яку мій клас не був вказаний у Classспадному меню. Врешті-решт я вилучив швидкий файл, перезапустив Xcode і заново створив файл. Нарешті клас був внесений до списку і може бути використаний у Storyboard.

Подивіться також на цю відповідь , яка схожа на вирішення «реальної» проблеми, з якою я зіткнувся.


Видалення та повторне додавання файлу класу працювало для мене. Дякую!
Nicolas Miari

6

Я вирішив цю проблему, набравши ім'я Модуля (на жаль, у списку, що випадає, нічого не буде показано ...) у Спеціальний клас інспектора ідентичності для всіх контролерів View та представлень.

Вам також може знадобитися вказати цільового постачальника. Щоб досягти цієї мети, ви можете відкрити таблицю розкадрування в режимі вихідного коду і додати атрибут "customModuleProvider" як у дужках ViewController, так і в кутовому вікні View.


6

Моє рішення (Xcode 8.1 Swift 3.0):

Невідомий клас xxx у файлі Interface Builder.

Відкрийте StoryBoard як вихідний код та знайдіть xxx . Видаліть атрибут, який містить значення xxx . Побудувати та запустити.


WTF? Це було для мене абсолютно необхідне, дякую. Мені довелося видалитиcustomModule="" customModuleProvider=""
Dan Rosenstark

1
Якщо ми спробуємо опублікувати додаток у магазині додатків, який містить подібну помилку, програму відмовляємо без роздумів.
ibrahimyilmaz

Я не погоджуюсь. Я щойно представив збірку, що мені довелося змінити цей спосіб на TestFlight, і він готовий до бета-тестування ... ми побачимо, що відбувається в реальному магазині додатків, але це ІМО помилки ІБ. Дякую!
Dan Rosenstark

4

У моєму випадку я додав прапор -ObjCдо Other Linker Flagsналаштувань проекту, щоб він працював. Також я спробував з -all_loadпрапором, і він також добре працював.

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


3

У моєму випадку для класу, на який посилається в Storyboard / xib, не встановлено цільове членство .

Щоб виправити, надайте цьому класу .hта .mфайлам те саме цільове членство, як і ваші інші класи.

Не встановлено цільового членства.


Це була моя проблема, але, намагаючись різних рішень, я спричинив проблему, яку вирішує відповідь Epic Byte. Ви повинні мати свій вихідний код у цілі, яку ви будуєте, але також у ІБ потрібно встановити контролер перегляду як частину поточної цілі.
SafeFastExpressive

Цільове членство теж було моєю проблемою, я шукав всюди, але завдяки цій відповіді я міг її вирішити.
Борж


2

Я зіткнувся з проблемою, коли я переніс аркуш від проекту Swift до проекту Objective-c, помітивши відповідь ввкузнецова , виявилося, що два проекти використовували один і той же ідентифікатор. Я "Продукт -> Очистити" та натисніть клавішу Enter у текстовому полі Модуль та Клас. питання відійшло.


2

Я вирішив це відповідно до того, що запропонувала Лаура, але мені не потрібно було відтворювати файли.

Використовуючи XCode 4, у Навігаторі проекту виберіть файл .m, який містить клас, на який він скаржиться

Перейдіть до пункту Перегляд-> Утиліти-> Показати інспектор файлів (це покаже Файловий інспектор праворуч із цією .m-інформацією про файл)

Відкрийте розділ Цільове членство та переконайтесь, що для цього .m-файлу вибрано вашу ціль

Коли я додав свій файл .m до свого проекту, він чомусь не додав його до моєї цілі за замовчуванням, і це призвело до того, що я отримав помилку, яку ви згадали.


2

У мене виникла помилка користувача. У мене було загальне UIView у моїй розгортці та в розділі «Спеціальний клас» інспектора ідентичності я випадково змінив назву з UIView на безтурботний.

Все, що потрібно було виправити, - це повернути його до UIView.


Я робив те ж саме, але випадково додав ім'я користувальницького перегляду контролерів до розділу користувальницького класу ViewControllers root. Тож я шукав, чому контролера View не вдалося знайти, коли він був корінним представленням весь час.
TMin

1

Що тільки працювало для мене, це фактично додавання назви модуля до файлу xib ...

Отож, файли xib виглядають так:

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

ХОРОШЕ рішення, на мою думку, але саме так, мабуть, Apple хоче, щоб ми це зробили зараз.

Це запитання показує 3 можливих роботи, що виникають у бета-версії 4 ... мабуть, Apple, на думку деяких, не дуже допомагає в цій ситуації, оскільки вони називають це "Робота за призначенням".


1

У мене була така ж проблема з Xcode версією 6.1 (6A1052d). Я думаю, що проблема з’являється, якщо ви перейменували проект App / Xcode Project.

Моє рішення полягало в тому, щоб вручну додати назву модуля до програми для створення інтерфейсів.


1

У мене була ця проблема після того, як я додав нову ціль, потім створив новий клас за допомогою діалогового вікна «Новий файл», але випадково не вдалося перевірити нову ціль, а також оригінальну ціль у діалоговому вікні створення, тому об’єкт додано лише до мого оригінальна ціль. Рішення полягало в тому, щоб видалити вихідні файли (лише видалити посилання), а потім додати їх назад, використовуючи "Додати файли", цього разу перевіривши обидві цілі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.