«Не удалось найти информацию для класса с именем ViewController»


154

Эта ошибка сводила меня с ума, так как я начал использовать Xcode (4.6.3). Всякий раз, когда я пытаюсь связать элемент раскадровки с моим кодом, я получаю сообщение об ошибке:

Не удалось найти информацию для класса с именем ViewController.

Это происходит и с пользовательскими классами. Я пробовал такие методы, как:

  • Удаление данных делегата.
  • Удаление и повторное добавление классов.
  • Перезапуск Xcode.
  • Переустановка Xcode.

Я не могу ctrl-перетаскивать, чтобы создавать соединения в любом из моих проектов, независимо от того, какой класс. Та же проблема возникает с совершенно новым шаблоном приложения. Если я наберу код вручную, а затем Ctrl-drag, я могу создать работающее соединение, но не могу добавить его автоматически. Ничто из того, что я смог найти в Интернете, не помогло. Есть указатели?


Вы в три раза уверены, что файл ViewController .m включен в соответствующую цель? (флажок в правой панели инспектора)
Alfie Hanssen

2
У вас есть контроллер представления в вашей раскадровке и указан «ViewController» для имени класса, который должен быть создан для управления представлением. Проверьте каждый контроллер представления в раскадровке: выберите контроллер представления, посмотрите на «инспектор идентификации» на правой панели и посмотрите на свойство «Пользовательский класс». Если он читает «ViewController», то есть ваша проблема. Введите имя класса, который должен управлять вашим контроллером представления ... или вставьте UIViewController, чтобы получить реализацию UIKit по умолчанию.
Николас Харт

1
Я изменил пользовательский класс на «UIViewController» в инспекторе идентичности и больше не мог перетаскивать ctrl из раскадровки в ViewController.h. Если я создаю новый класс и пытаюсь перетащить его в него (после соответствующей установки класса контроллера представления), я получаю ту же ошибку «Не удалось найти информацию».
user2597451

4
У меня была эта проблема, и изменение автоматически сгенерированного класса ViewController работало на меня. Например, просто добавьте NSLog()кviewDidLoad:
JB

Ответы:


292

Что решило эту проблему для меня, так это удаление класса из проекта.

шаги:

  1. В проводнике проекта (левая панель) найдите класс и щелкните правой кнопкой мыши -> Удалить.
  2. Удалить ссылку (не переходить в мусорное ведро, так как вы навсегда потеряете класс)
  3. Щелкните правой кнопкой мыши папку, в которой содержался класс -> Добавить файлы в ...
  4. Найдите класс, который вы только что удалили в файловой системе

Это, кажется, заставляет XCode связать класс обратно в раскадровку.

Примечание: для меня не сработало следующее:

  • Закрытие Xcode
  • Очистка проекта
  • Удаление имени класса из раскадровки и повторный ввод его

Я думаю, что это ошибка со стороны Apple


8
Я попробовал это, но у меня не получилось / -: та же ошибка.
Майкл

1
@ Михаил, да, сейчас я в ситуации, когда ничего из вышеперечисленного не работает вообще. Xcode это ***
Крис Харрисон

5
Эта проблема восходит к июлю 2013 года, по состоянию на сегодня май 2016 года я получаю ту же ошибку и исправляю ее с помощью этого ответа. Почему так много лет Apple не исправляет это навсегда?
SkyWalker

3
Не могу поверить, что это все еще проблема. Просто нужно было сделать это на XCode 8.1 ..
fisk

2
2017 (версия 8.2 (8C38)) и все еще жив, XCode SUCKS. Это происходит со мной, когда вы копируете и вставляете сотрудников пользовательского интерфейса из раскадровки из одной сцены в другую
Хайме Агудо

135

В случае, если кто-то все еще разочарован этим, есть способ заставить все работать.

То, что я делаю, - это ввод розетки в свой класс, например:, @IBOutlet weak var someView: UIView!и перетаскивание из кода в представление в IB или раскадровке. После этого я могу перетаскивать из IB / Storyboard в свой класс для установления соединений, помощники редакторов распознают класс в «Автоматическом» и т. Д.

Работает каждый раз.


6
@ Gmeister4, если вы создаете розетку в своем коде, она показывает маленький кружок слева от розетки. Нажмите и перетащите из этого круга на представление в IB или Раскадровке, чтобы установить соединение.
Эндрю Робинсон

4
Проще, чем верхний ответ. +1
cph2117

2
Все еще не может сделать это должным образом, даже после этого - но по крайней мере это работает!
Александр Г

1
Ни один из приведенных выше ответов не работал для меня. Только этот ответ работал для меня.
coolcool1994

1
Круто, вот и все!
Сэм

38

Для меня удаление их из целевого членства в правом столбце и добавление их снова сделало свое дело введите описание изображения здесь


Это также сработало от меня. Я продублировал класс ViewController.swift, и это, кажется, решение.
UberJames

Я думаю, что это ошибка Xcode, которая все еще существует в Xcode 8.0
jiangjiefs

Это случилось прямо сейчас со мной в Xcode 8.3.3, и ваше решение самое простое и работает. Так что спасибо тебе!!!
RoberRM

Все еще существует в Xcode 11.5 (я имею в виду серьезно Apple ??). Единственное решение, которое сработало для меня, перечислено здесь.
Кристоф Фондачи

12

Иногда Xcode делает это из-за того, что VC не ссылается на файл класса. Простое решение для этого:

написать свойство вручную, как указано.

class YourClassName{

     @IBOutlet weak var YourTableName: UITableView!

}

Это создаст пустой знак ссылки перед @IBOutlet , откройте ваш проект в помощнике редактора, затем нажмите знак ссылки введите описание изображения здесьи перетащите в представление, к которому вы хотите подключиться (я подключился к TableView). и это все. Наслаждайтесь счастливым кодированием !!!


8

У меня только была эта проблема в апреле 2017 года с Xcode 8

Просто создайте розетку с помощью кода и компилируйте ее. например:

@IBOutlet weak var containerViewHeight: NSLayoutConstraint!

Вы должны любить Xcode ...

Редактировать: Все еще происходит в Xcode 9


7

следующие шаги работают для меня, надеюсь, что это работает и для вас

1- Вам необходимо заново открыть проект после закрытия Xcode.

2 - дождаться индексации файлов проекта

3- Проверьте, работает ли он или нет

4- Если все еще не работает, выполните шаг 5, если не рад за вас :)

5- Очистить и построить цель вашего проекта

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


7

Я перепробовал все, и это не сработало, поэтому для меня то, что сработало, это:

  • Очистите папку Build и проект.
  • Открытые проекты (Окно -> Проекты)
  • Найдите свой проект в списке и удалите производные данные
  • Закрыть Xcode
  • Перезагрузите компьютер (не выбирая повторно открывать открытые окна)
  • запустить Xcode
  • Работай!

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


4

Для меня сработало следующее:

  1. Выполните «clean» и «clean build folder» (нажмите «option» в меню Product, чтобы получить команду «clean build folder»

  2. Стоп Xcode

  3. В терминале перейдите в папку производных данных:

    (/ Users // Library / Developer / Xcode / DerivedData)

Удалите каталог производных данных для вашего проекта.

  1. Волна мертвого цыпленка в воздухе

  2. Запустить Xcode


3

Я должен был сделать комбинацию из пары ответов:

  1. Удалите имя пользовательского класса из раскадровки.

(Нажмите желтую кнопку в левом верхнем углу контроллера представления в раскадровке -> перейдите к инспектору идентификации (опция + команда + 3) -> удалите имя пользовательского класса вверху)

  1. Удалить ссылку на файл контроллера представления.

(Щелкните правой кнопкой мыши файл -> удалить -> удалить ссылку)

  1. Добавьте файл контроллера представления обратно в проект.

(Щелкните правой кнопкой мыши папку, в которой находился файл -> «Добавить файл в [проект]»)

  1. Добавьте имя пользовательского класса обратно в раскадровку.

3

Если люди попробуют описанное выше, и все еще не работает, странная уловка, которая сработала для меня, заключалась в добавлении выхода в пробел. Это работает, если нет других строк непосредственно над или под добавляемой вами строкой. Странно, но это сработало!


3

Для меня работало то, что вместо перетаскивания соединения с кнопки на код было:

  1. Нажав на нужный элемент раскадровки.
  2. Открытие инспектора соединений (правая панель)
  3. Перетаскивание из круга + в область кода. Вот так:

после того, как я связал свой код таким образом, после этого он работал нормально.


3

Оставайтесь на цели!

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

Как это происходит, у меня есть несколько целей в моей рабочей области, и часто мне приходится переключаться между ними.

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

Коротко

Шаг 1.

Целевая селекция

Убедитесь, что у вас установлен правильный целевой набор, чтобы индексирование имело смысл.


3

Это сработало для меня:

  1. Выполните « Очистить папку сборки »
    (нажмите и удерживайте клавишу «Опции» и перейдите в меню « Продукт », чтобы получить к нему доступ.
  2. Выполните простую «Очистку» (CMD-SHIFT-K) из меню « Продукт ».
  3. Создайте проект, чтобы позволить Xcode компилировать файлы. Кроме того, позвольте ему индексировать файлы, если это необходимо.

С другой стороны, я не уверен, помогло ли это, но я также удалил Производные данные перед выполнением вышеупомянутых шагов (предпочтения XCode> Местоположения)


2

Выберите ViewController в storyBoard, удалите текущее значение на правой панели / «Класс клиента» / «Класс», затем повторно добавьте класс управления (тип: «SampleViewController» ...), введите. -> Это работает для меня


2

Я попробовал все эти ответы, проблема для меня была связана с тем, что Xcode не смог проиндексировать файлы. Я исправил это, просто выйдя из Xcode и снова открыв проект. Конечно, я сделал это, попробовав все вышеперечисленные решения: p



2

Это самый легкий шаг, который я сделал, чтобы решить эту проблему.

  1. Я убираю проект
  2. Перетащите новую кнопку в контроллер вида.
  3. Постройте проект.
  4. Подключите только что вытащенную кнопку к классу (либо розетка, либо действие).
  5. Тогда вуаля !!! Другие розетки теперь могут быть снова подключены к классу!

1

Как показывает мой опыт тестирования, если вы удалите класс, который был связан с XCode, и затем добавите файл снова, то эта проблема возникнет.


1

Обычно, когда это происходит со мной, я просто еще не сохранил код для класса. Просто перейдите к коду и нажмите cmd + s, и это часто решает проблему правильно.



1

Ни один из вышеперечисленных шагов не помог мне, но я думаю, что, возможно, обнаружил проблему. По крайней мере, это то, что сработало для меня, и это не ошибка в XCode.

Когда в редакторе помощника посмотрите на верхнюю часть окна, в котором есть код для вашего viewController. Третий вариант справа, вероятно, говорит «Ручной», но он должен сказать «Автоматический». Как только я изменил это, проблема была решена!


1

У меня была похожая проблема: «Не удалось найти класс с именем ...», и причина была глупой с моей стороны, как только я понял это. Убедитесь, что вы не перетаскиваете из элемента в интерфейс - убедитесь, что он перетаскивается в сам класс


1

Я пытался ВСЕ!

Убедитесь, что имя класса вашего UIViewController не содержит слова «Test»

Отчет об ошибке отправлен.


Определенно не говорю, что это единственная причина. Просто это еще одна вещь, о которой нужно знать.
Аарон

Помогите удалить все производные данные, очистить проект. Но это ошибка, и вы правы.
Женевий

0

Я попытался бы переделать файлы .m и .h и дать им оригинальное имя, а не общее, как «ViewController». Попробуйте что-то еще в соответствии с тем, что вы хотите, чтобы этот файл делал, и заканчивая View Controller (то есть "PizzaDecoraterViewController")

Затем выберите ViewController, который вы хотите подключить к этим файлам. Убедитесь, что вы выбрали ViewController, а не просто объект внутри. Нажмите на черную полосу внизу (та, которая имеет значки «Первый ответчик» и «Выход»). Весь ViewController должен выделяться синим цветом. Затем перейдите в раздел Custom Class в Identity Inspector, и вы увидите серое «UIViewController» в первом поле. В этом поле введите имя файла .h или .m, к которому вы хотите подключиться (начните вводить PizzaDecorator ... и он должен выполнить небольшую процедуру автозаполнения). Затем нажмите ENTER.

Когда вы открываете Ассистент редактора, убедитесь, что файл, который вы пытаетесь перетащить в нужное место, на самом деле является правильным файлом.

Если вы сделали все как сказано выше, то это должно сработать.


Все еще не работает, к сожалению. Я пытался сделать это раньше, но безрезультатно. Вот скриншот: i.imgur.com/5ixtcps.png
user2597451

Да. Странный. Попробуйте добавить их программно (например, @property (nonatomic, strong) IBOutlet UIView * test;), а затем, когда рядом с ним появится маленький кружок, перетащите его в свой UIView.
CaptJak

Это работает и всегда есть (и приложения, кажется, работают нормально), но я пытаюсь решить проблему, которая не будет добавлена ​​автоматически.
user2597451

Ну, если это работает так, то должно работать по-другому. Ошибка в вашем XCode? Попробуйте получить предыдущую версию (например, 4.6.2 или что-то еще) и установить ее. В противном случае, ммммммммммммммм ... да ...
CaptJak

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

0

Как я прокомментировал ответ @ ChrisHarrison, эти вещи у меня не сработали, но, удалив производные данные, как я получил их на работу, удалив производные данные, как в https://stackoverflow.com/a/16182672/1449799


0

Удалите файлы (только ссылки) и добавьте файлы снова.


0

Что ж, в моем случае сработало (это немного странно, но сработало) следующее:

Попробуйте добавить источник данных (например, расширение для ViewController, например UITableViewDataSource). Xcode попытается перезагрузить ViewController. Затем я написал какой-то метод протокола (вначале Xcode не выполнял автозаполнение методов, а выписал его вручную), затем я добавил IBOutlets и, наконец, я удалил источник данных.

Пример:

class TestViewController:UIViewController{
    // This viewController presents “Could not find any information for  class named ViewController”
}

extension TestViewController:UITableViewDataSource{
    //Add Some methods of the protocol, Xcode will try to autocomplete and then it's going to reload the class, from then you can add your IBOulets / Actions .. And remove this extension if you don't need it otherwise.
}

0

Для меня представление, для которого я указал пользовательский класс, не может быть скомпилировано конструктором интерфейса. Это было отмечено @IBDesignable.

Удалите @IBDesignable, а затем добавьте мои розетки, а затем пометьте как @IBDesignableрешенную проблему в моем случае.


0

Просто попробуйте удалить производные данные для проекта


0

просто попробуй это

rm -rf ~/Library/Caches/com.apple.dt.Xcode
defaults delete com.apple.dt.Xcode IDEIndexDisable
defaults write com.apple.dt.Xcode IDEIndexEnable 1 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.