Xcode 4: создание xib UIView, неправильное подключение

84

Я пытаюсь создать перо, содержащее представление, которое будет встроено в TableViewCell. Я создал файлы интерфейса и реализации, ResultCell.hи ResultCell.m. Они стандартные, готовые, без изменений кода.

Затем я создаю пустой файл XIB и перетаскиваю на него UIView. Затем я нажимаю «Владелец файла» и устанавливаю тип ResultCell. Я нажимаю на представление и устанавливаю его класс также ResultCell.

Вот проблемы, которые у меня есть:

  1. При использовании вида Assistant Editor (в котором я живу) ResultCell.h файл не отображается, когда я просматриваю файл ResultCell.xib. Мне нужно заставить его загрузиться, нажав «Автоматически» и выбрав файл.
  2. Когда я перетаскиваю метку в представление, а затем нажимаю Ctrl + щелчок и перетаскиваю в .h для создания выхода, я получаю следующее сообщение об ошибке: « Не удалось вставить новое подключение к розетке: не удалось найти никакой информации о классе с именем ResultCell. "

Я пробовал создавать и воссоздавать представление, но оно просто не работает, и я начал терять терпение. Любая помощь будет очень, очень признательна!

Тим Салливан
источник
Я сам столкнулся с этим. Прошлой ночью это сработало, а сегодня ничего. Я дам тебе знать, если найду что-нибудь.
Tavison
Для справки, несколько ответов здесь помогли мне за последний год. Последние версии Xcode улучшили ситуацию.
Тим Салливан,

Ответы:

82

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

Дефрагментированный
источник
+1 У меня тоже сработало. Просто перезапустите XCode, и теперь я могу CTRL + перетаскивать, чтобы создать новый @propertys в моем .h файле.
Майк Гледхилл
1
Ответ Дэвида Писони сработал для меня. Простой перезапуск Xcode не помог.
Энди
У меня не было этой проблемы для многих выпусков Xcode сейчас, поэтому, вероятно, есть другая причина, которая сейчас более распространена, чем та, с которой я столкнулся, когда писал этот ответ в прошлом году.
Defragged
@Defragged, можете ли вы также включить этап очистки кеша, нажав команду K перед цитированием, или, что еще лучше, выйти из Xcode и очистить кеш ( ~/Library/Developer/Xcode/DerivedData)
user1046037
Я работаю с Xamarin Studio. Мне пришлось выйти из xcode и xamarin studio, затем снова открыть Xamamrin Studio и открыть отсюда файл xib, запущенный в xcode. После этого помощник редактора открылся правильно.
Дэйв Хэй,
113

Я попал в подобное состояние только сегодня. Это было очень странно: я мог присоединить любой XIB (новый или существующий) к любому уже существующему классу ViewController в проекте, но я не мог создать новый ViewController и правильно подключить его к любому XIB. Функциональность «помощника» не работала, как и функциональность соединения IB-файла заголовка.

Закрытие проекта и повторное открытие не помогли.
Выход из XCode и перезапуск не исправили.
Создание нового проекта и тестирование функциональности работали нормально, что заставило меня поверить в то, что где-то в каком-то кеше есть что-то поврежденное.

Мое решение

  • Закройте свой проект.
  • Перейдите в папку ~ / Library / Developer / XCode / DerivedData и УДАЛИТЕ все подпапки, ссылающиеся на проект, над которым вы работаете.
  • Откройте свой проект в XCode. Проблема должна быть исправлена ​​сейчас.

Между прочим, простая полная очистка, похоже, не прояснила ситуацию. Пришлось выбросить производные данные. Я уверен, что попал в эту позицию из-за игр с git, в которые играл, но я понятия не имел, как выйти, потому что даже переключение на более ранние версии git не помогло. (Это также было большим ключом к разгадке того, что сам проект не отслеживал это.)

Дэвид Пизони
источник
6
Я только что вошел в SO на своем Mac, чтобы проголосовать за этот ответ! Полностью сработало для меня. Это сводило меня с ума, так как я только учусь использовать XCode, и это уже достаточно сложно без таких нелепых проблем. :) Спасибо!!!
Дэйв
2
он работает даже без перезапуска xcode; просто удаление производных данных и восстановление (в проекте iOS)
ноя
Это сработало, когда перезапуск xcode не работал. Понятия не имею, как это произошло - метод Дэвида Писони отлично сработал.
mmopy
Потрясающе. Как ты это узнал? Работал у меня.
Хол
1
lol, хорошо знать, что IOS и xcode могут быть такими же ошибочными, если не больше, чем при использовании eclipse и Android: p
Джеймс Андресакис
14

У меня была эта проблема, и перезапуск Xcode ее не устранил. Я удалил файлы классов из проекта, затем добавил их обратно, и он начал работать.

Jasongregori
источник
13

У меня была такая же проблема. И я попробовал:

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

Ничего из этого не сработало. Для меня сработало просто:

  • Удалите файлы "подозрительных" классов из проекта (просто удалите ссылки, а?)
  • Повторно добавить их в проект

И готово!

Доктор Камелеон
источник
2
У меня это сработало, спасибо! Это было первое, что я попробовал, кроме перезапуска XCode, так как это казалось наименьшим объемом работы и риска, и он отлично работал.
Adriandz 06
1
работал у меня после перезапуска xcode и удаления производных данных
elad s
1
Этот тоже помог мне. Это может иметь какое-то отношение к рефакторингу имен классов (что я делал раньше).
экотакс
9

Если перезапуск Xcode у вас не работает, я обнаружил, что переключение нового файла .m обратно в целевое членство работает.

Дуэйн Филдс
источник
3

Это помогло мне:

  1. на панели файлов проекта (слева) выберите поврежденный xib-файл.
  2. Щелкните значок «Владелец файлов» в редакторе.
  3. на Панели свойств (справа) выберите третью вкладку (вверху)
  4. укажите "Пользовательский класс"

Если вы не видите «панель», взгляните на верхний правый угол окна и включите соответствующие кнопки «просмотра». Если вы не видите кнопки «Просмотр», нажмите на самую верхнюю правую кнопку капсулы.

Иван Доссев
источник
Недавно я изменил (рефакторинг) имя класса. Для пользовательского класса, упомянутого в этом ответе, все еще было установлено старое имя. Изменил его на новое имя, и оно исправлено.
PaulMrG 07
2

Я заметил, что файл .m был перемещен в папку en.lproj.

Просто удалите (только для справки) файл .m из Xcode и переместите .m из en.lproj. Добавьте его снова, это решит проблему.

Не волнуйтесь, вы восстановите все свои связи.

В ВИДЕ
источник
Мой .m был создан автоматически, и я еще не менял его. Я сделал, и все было в порядке. Больше ничего не работало.
Entonio
2

Сегодня я столкнулся с той же проблемой. Перезапуск XCode не решил проблему. Я был в состоянии получить вещи в нормальное состояние с помощью «Удалить» вариант «Derived данных» от проекта , который можно найти под Организатора . Организатор сообщает, что «Производные данные включают индекс, выходные данные построения и журналы». Я предполагаю, что причиной этой проблемы был либо вывод индекса, либо вывод построения .

Правин Кумар
источник
2

в XCode перейдите в органайзер, щелкните проект, щелкните удалить производные данные ... чем очистить проект

Питер Лапису
источник
2

В моем случае это помогло внести «фальшивое изменение» (просто пробел) в соответствующий заголовочный файл.

jakob.j
источник
Думаю, это могло сделать то же самое для меня. В моем случае я добавил розетку вручную. Затем я смог подключить к нему свою лапшу, а также создать новые выходы, перетаскивая ctrl.
Дэниел Вуд
1
  1. ResultCell должен быть подклассом UITableViewCell
  2. Вы не должны перетаскивать UIViewна пустой холст, вы должны перетаскиватьUITableViewCell
  3. Вы должны выбрать ячейку и изменить ее на свой подкласс
  4. Хозяин чаще всего - контроллер с выходом в ячейку

Каждый раз, когда вы хотите загрузить новую ячейку, звоните:

 [[NSBundle mainBundle] loadNibNamed:nibName 
                               owner:controllerWithOutletToCell 
                             options:nil]

после загрузки используйте ячейку и установите для параметра ivar / output значение nil, готовность к следующей загрузке

есть и другие способы, но это обычное дело

Bshirley
источник
Если я это сделаю, у меня будет точно такая же проблема. Редактор помощника не отображает .h, когда я просматриваю перо, а нажатие ctrl + drag не создает код выхода, а отображает ошибку.
Тим Салливан
2
Вы используете 4.0.2 Xcode? Вы можете вручную настроить помощника редактора, если он плохо себя ведет. Я предполагаю, что вы перезапустили приложение, чтобы повторно протестировать эту проблему (Xcode 4 часто выигрывает от этого). Похоже, он не может найти файлы классов в проекте, или что-то неправильно названо - важно использовать заглавные буквы. Строится ли проект? Это функциональность очень высокого уровня, которая зависит от новой технологии компилятора.
bshirley
Ой, черт меня побери. Да, перезапустил Xcode, и он сразу заработал. «Извините, я сейчас упаду на свой меч.
Тим Салливан
1

Возможно, у меня сработало вот это .. (Xcode v4.5)

Это не сработало

Я пытался управлять перетаскиванием в определение интерфейса моего .h

@interface SearchViewController : UIViewController

@end

Это сработало (возможно, так оно и должно было работать, я этого раньше не знал). Смотрите открытые и закрывающие скобки. Управляйте перетаскиванием после закрытой скобки.

@interface SearchViewController : UIViewController
{
}

@end
Мули
источник
1

У меня была аналогичная проблема с проектом, написанным на Swift.

Что сработало для меня, так это настройка IBOutlet в таком коде

@IBOutlet var foo: UIView?

а затем подключите его к Интерфейсному Разработчику, перетащив его на маленький кружок, появившийся рядом со строкой кода.

Патрик
источник
Это ЕДИНСТВЕННЫЙ способ заставить его работать и для меня. Я следил за учебником Apple, написанным для Objective-C (начните разработку приложений для iOS сегодня), и мне нужно было подключить текстовое поле New To-Do Item. Наконец, я создал @IBOutlet var textField: UITextField? и связан с этим, и это сработало. Использование XCode 6.4
Эндрюс
1

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

https://stackoverflow.com/a/15873770/2846800

Я работал над большим проектом в предыдущей версии XCode и отключил индексацию. После повторного включения индексации моя проблема теперь решена:

defaults delete com.apple.dt.XCode IDEIndexDisable

Теперь я могу использовать функции D&D Interface Builder. Надеюсь, это поможет другим ...

user2846800
источник
1

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

Во всяком случае, способ исправить это выглядит следующим образом:

  1. Очистить проект
  2. Щелкните (Ваш проект) в представлении Project Navigator. Перейдите в Compile Sources в разделе Build Phases целевого объекта, для которого вы строите. Удалите и добавьте обратно файл .m, который вызывает у вас проблемы.
  3. В качестве альтернативы, в инспекторе файлов (представление «Утилиты») файла NIB в разделе «Целевое членство» снимите флажок и снова проверьте целевое имя.
  4. Перезапустите Xcode для хорошей оценки.
  5. Конечно, это тоже должно исправить только удаление и добавление .m файла.

(Только шаги 1 и 2 исправили это для меня.)

кодовый ожог
источник
0

Если вы скопировали файлы из другого проекта, просто убедитесь, что вы установили флажок «Добавить в цели».

John67
источник
0

Переименование файлов классов может отсоединить их от XIB. Этот ответ помог мне обнаружить это:

Ctrl-перетаскивание от кнопки к методу не работает. Xcode / Интерфейсный разработчик

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

Александр Либерсон
источник
0

Аналогичный симптом, но другая причина.

По-видимому, я нажал клавишу возврата, когда фокус был на представлении помощника, потому что одна из стандартных строк комментариев шаблона файла пошла с // на /, что привело к тому, что файл не компилировался.

Исправление комментария позволило SDK проанализировать файл, распознать его как UIViewController и добавить в розетку.

ТАК - если у вас есть эта проблема, выполните сборку или проанализируйте, чтобы увидеть, есть ли ошибки, которые необходимо исправить в файле .h вашего контроллера представления. ЗАТЕМ попробуйте другие решения.

программное обеспечение развивалось
источник
0

Это может быть старая тема, но на всякий случай, если у кого-то возникнет такая же проблема в будущем, попробуйте удалить связанные файлы .xib, .h и .m и создать новые. Для меня UIViewController в моем файле .h не был фиолетовым, и даже обратный интервал и его ввод не помогли.

SG
источник
0

Просто поставьте черту между @implementation и @synthesize. Большинство ответов здесь имеют это общее. Это сработало для меня

@implementation 

@synthesize
user2371963
источник
0

Я просто попробовал все здесь, и ничего не получилось (с использованием Developer Preview для Xcode 5).

Единственное, что у меня сработало, это поместить эту неполную строку в мой интерфейсный файл:

@property (nonatomic, weak)

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

Джибути33
источник
0

Для меня очистка или удаление DerivedData решили проблему.

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

Затем я воссоздал класс UIViewController и дал ему другое имя. Это решило проблему для меня.

Фабиан Старк
источник
0

У меня была эта проблема, и я нашел решение, не указанное выше.

В моем случае я мог видеть, что что-то не так в файле класса .h, потому что мой пользовательский контроллер представления не распознал класс: UIViewController (он был черным, а не фиолетовым). Все другие настраиваемые контроллеры представления имели: UIViewController фиолетового цвета.

в моем случае и, возможно, в вашем, мне нужно было добавить класс в раскрывающийся список целей / этапов сборки / компиляции. Необходимо добавить .m. Все остальные .m были там, но не этот.

Как только я добавил его,: UIViewController появился фиолетовым цветом, и все работало нормально.

Michendo
источник
0

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

Перейдите в target> Build Target Architectures Only> и установите для Debug и Release значение NO.

Установите это для всех проектов в рабочей области и перекомпилируйте, чтобы убедиться, что нет других ошибок. Может быть, не имеет смысла, но как-то это удалось. Во время компиляции у меня были другие проблемы, такие как ошибки компоновщика и не найденные символы.

morph85
источник
0

Для файла * .m этого представления класса откройте «Показать файловый инспектор» и снимите флажок «Целевое членство» для этого проекта, затем выполните Очистку (меню Продукт-> Очистить) и снова установите флажок «Целевое членство» для этого проекта.

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

Козлов В
источник
0

Используя Swift, у меня была аналогичная проблема. Я обнаружил, что комментарии были для меня частью проблемы.

Я воспользовался контроллером представления по умолчанию, поработал с ним, а затем создал второй контроллер представления, скопировав весь первый, убрав его до viewDidLoad () и переименовав класс в TestViewController. Сборки работали, код выполнен. Все было хорошо.

Когда я пытался перетащить UITextField, чтобы создать выход, он меня не пустил. Я заметил, что в моих комментариях по-прежнему написано «ViewController.swift», поэтому я изменил текст комментария на «TestViewController.swift» и перестроил. Я смог подключить розетку!

Интересно, произошло ли то, что индексатор читал комментарии, а также имена классов и почему-то запутался.

Антонио Чолино
источник
0

Надеюсь, это поможет кому-то там.

Мне просто пришлось удалить папку с производными данными. Вам нужно нажать Окно -> Организатор -> Проекты -> Удалить производные данные.

И ПЕРЕЗАГРУЗИТЕ XCODE.

Тебе должно быть хорошо!

Роналдох1
источник
0

Новый класс, не являющийся частью «TARGET», вероятно, является основной причиной этого, как указано в некоторых из этих ответов.

При создании нового класса какао по умолчанию опция добавления нового класса в цель по умолчанию отмечена, но если по какой-либо причине это не должно быть проверено, когда вы нажимаете «Сохранить», у вас будет эта проблема.

Новая цель класса

Любой из этих обходных путей, которые добавляют новый класс к цели приложения, будет работать для решения проблемы, и это то, что объединяет все эти «исправления».

Я думаю, что XCode, вероятно, имеет некоторые ошибки, из-за которых новый файл по умолчанию НЕ добавляется в основную цель приложения. Исправление сводится к добавлению вашего `` сломанного '' класса в основную TARGET.

Майкл Бопп
источник
0

В XCode 7.1 добавление коннектора в другой точке исходного файла работало. Ошибка, которую я получал, относилась к одной из моих переменных, как если бы это был класс (не имело никакого смысла). Ошибка перестала возникать, когда я добавил коннектор под этой переменной, а не над ней.

user2683747
источник
0

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

Решением было бы удалить его и воссоздать с правильным шаблоном. введите описание изображения здесь

Михир Мехта
источник