Ошибка в Xcode 6 - контроллер просмотра не имеет выхода с именем (subview)

Я только что получил эту ошибку в одном из моих приложений, и после проверки некоторых других приложений происходит одна и та же ошибка. Ни один из моих IBOutlets и IBActions больше не подключен. Когда я воссоздаю выход через управление, перетаскивая его в файл .h, на выходе по-прежнему отображается ошибка в Connections Inspector > Outlets, говоря, что (контроллер просмотра) не имеет выхода с именем (subview). До сегодняшнего дня у меня не было этой проблемы, так же как и с Xcode 6? Контроллер представления ссылается на правильный класс в "Identity Inspector > Custom Class". Я удалил папку производных данных, удалил ссылку на файл .h, очистил проект и очистил папку сборки. Ничто из этого не сработало, и я не могу продвигаться с развитием, пока эта проблема не будет исправлена.

Outlets show exclamation mark. Note 'easyLabel'

I disconnect easyLabel, and the outlet disappears. I can't reconnect it with drag and drop.

Обновление: я только что открыл проект через пару дней, и у моих выходов больше нет восклицательного знака рядом с ними, и снова появилась "easyLabel", которую я отключил. Я ничего не менял, поэтому я предполагаю, что это ошибка в Xcode 6-6.1.

Обновление 2: эта ошибка вернулась. Восклицательные знаки рядом с каждой розеткой. Если я их удалю, я не могу их повторно добавить. Невозможно создать новые выходы. Также не может дать контроллеру вида пользовательский класс. Я просто хочу добиться определенного прогресса в приложении, но эта проблема повторяется. На самом деле просто терпеть не могу. Любая помощь будет оценена.

Ответ 1

Дубликат: Xcode 6: не может подключить IBOutlet к ViewController, но вот хитрость:

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

У меня была точно такая же проблема с приложением, над которым я сейчас работаю, обновляющим Xcode с 5.xxx до 6.1. Обходной путь, который работал для меня, состоял в том, чтобы удалить ссылку каждого контроллера представления и повторно добавить их в проект... К сожалению, в некоторых случаях, на самом деле, мои, все соединения снова теряются при закрытии XCode.

Для всех, кто сталкивается с этой проблемой, вот (раздражающий) трюк:

  • Шаг 1: выберите .h и .m просмотр файлов контроллера
  • Шаг 2: удалите ссылку на эти файлы
  • Шаг 3: повторно добавьте файлы в дерево вашего проекта
  • Шаг 4: откройте раскадровку, в итоге пересоберите проект и улыбнитесь

Я могу понять, что эти вещи действительно раздражают, но у меня это сработало... Надеюсь, это поможет кому-то еще!

Ответ 2

У меня была такая же проблема, и то, что ломало мои раскадровки, было тем фактом, что мой проект находился внутри папки /Dropbox (MyName)/projects/

По-видимому, что-то о имени папки Dropbox с пробелами и() было полностью отключено моей раскадрой, попробуйте то, что я сделал, и полностью переместим проект в другую папку и посмотрим, поможет ли это:)

Ответ 3

У меня была та же проблема, изменил класс под идентификатором "Инспектор" > "Пользовательский класс" на что-то еще, сохранил его, а затем снова установил в правильную, после того, как соединения появились нормально.

Ответ 4

У меня возникла проблема с подклассом Swift UIViewController. Я удалил исходное представление, которое создал IB для меня, и добавил новое представление, которое я не смог подключить.

Я пошел к инспектору Identity для владельца файла и попытался снова ввести его, подумав, что, возможно, он каким-то образом был изменен. Как ни странно, имя класса не было автозаполнено. Казалось, что XCode не смог увидеть мой класс.

Я попытался удалить и повторно добавить файлы .swift и .xib, но безрезультатно. XCode позволит мне вручную ввести имя моего владельца, но оно не будет автозаполнено. Казалось, он считал, что этого не существует или недействителен для этого контекста.

Оглядываясь назад на мой код, у меня было что-то вроде следующего:

extension SomeViewController {
    func foo() -> Bool {
        return false
    }
}

class SomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Он компилируется просто отлично, но, предположив, я удалил расширение. Я сохранил файл, вернулся к .xib и смог снова установить идентификатор File Owner с автозаполнением. Я также смог подключить представление.

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

class SomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

extension SomeViewController {
    func foo() -> Bool {
        return false
    }
}

Все еще работало в IB. Чтобы проверить здравомыслие, я переместил расширение обратно перед определением класса, и все снова было исправлено.

Я взглянул на * -Swift.h, сгенерированный XCode, и, по крайней мере, относительно затронутого класса, казалось, не было различий - независимо от того, где я помещал расширения в файл Swift, они всегда были объявлены после определения @interface для фактического класса в заголовке.

Итак, длинный рассказ, в моем случае это произошло из-за расширений Swift (я говорю, что расширения, потому что у моего фактического кода много), перед определением класса. Я переместил их после определения класса, и проблема исчезла.

Ответ 5

Для меня мне пришлось удалить ссылку и добавить в проект проект -XIB файл для моего контроллера. Просто удалив контроллер вида .h/.m, не reset выходы, но удаление .xib и добавление его было сделано!

Ответ 6

У меня есть эта проблема только с @protocol defined IBOutlets, если я не переопределяю их в классе реализации.

Возможно, единственное, что мы можем сделать, это записать bug.

Ответ 7

Почему вы не обновляете xcode 6.0.1 до xcode 6.1, Apple исправила множество ошибок.

Загрузите Xcode 6

Ответ 8

У вас возникает такая же проблема, если вы подключаете действия/выходы в Interface Builder вместо помощника? Для действий попробуйте управлять перетаскиванием из вашего объекта в IB к вашему первому объекту-ответчику (или тому, к чему у вас установлен ваш класс).

Ответ 9

@robb действительно обнаружил исправление для этого, но проблема, которую он обнаружил, заключалась в том, что группа в проекте, которая зеркалировала папку на диске, использовала другой случай.

Итак, если проектная группа была Broken/classone.m

и на диске он был сломан /classone.m

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

Ответ 10

У меня была та же проблема, но это было потому, что я изменил имя контроллера представления в Навигаторе проекта на MapViewController, но его имя осталось (ViewController) в коде. как только я изменил это, это сработало

Ответ 11

У меня была такая же проблема, поскольку с помощью XCode 6.1 ответы выше не работали для меня. (удаление/повторное добавление файлов классов, изменение класса на что-то еще, а затем его изменение). Единственное, что я не пытался создать новый проект с нуля).

Я случайно заметил, что мой "Application" placeholder в MainMenu.xib каким-то образом получил свой набор классов для NSObject. Изменение этого в NSApplication, казалось, очистило проблему "не имеет выхода с именем" из всех моих других объектов.

Ответ 12

Xcode 6.3.2. Аналогичный вопрос. Проект (ы), над которым я работал, внезапно "отключает" IBOutlets и показывает ошибку

view controller does not have an outlet named (subview)

Проект по-прежнему строится и работает, и если вы наводите курсор на IBOutlets в коде, он считает, что он все еще подключен.

Я прибил это (по крайней мере, в моем случае) к проблеме с сохранением проектов в Dropbox (как и в предыдущем сообщении). Исправление для меня было очень просто:

Перетащите папку проекта с Dropbox на рабочий стол. Затем перетащите проект обратно в Dropbox.

Это решение устранило многочисленные проекты с проблемой.

Ответ 13

Я обновил свой проект с Xcode 6.x до Xcode 7.x около двух месяцев назад без каких-либо проблем. Но потом этим утром я столкнулся с этой ошибкой. Я пробовал почти все на этой странице, но ничего не сработало. Но тогда решение Джастина Миддлтона дало мне представление.

Когда я переключил свой проект с 10.9 SDK на SDK 10.11, я решил, что хочу, чтобы мой код оставался обратно совместимым, только если мне пришлось вернуться к Xcode 6.2. Поэтому я поставил код препроцессора вокруг нескольких моих объявлений объектов, например:

// This caused the (!) problem in Interface Builder

#if( MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_10 )
@interface CLChatWindowController : NSObject <WebPolicyDelegate, WebUIDelegate, WebFrameLoadDelegate>
#else
@interface CLChatWindowController : NSObject
#endif
...


// Removing all the Preprocessor code fixed the problem

@interface CLChatWindowController : NSObject <WebPolicyDelegate, WebUIDelegate, WebFrameLoadDelegate>
....

Как только я удалил весь код препроцессора, символы (!) в Interface Builder исчезли, и все вернулось к норме. Надежда, которая помогает кому-то.

Ответ 14

Попробуйте добавить файл заголовка в проект, если он отсутствует.

Ответ 15

У меня это было в Xcode 7.0.1 в быстром проекте. В частности, соединения со списком таблиц были разбиты (постоянно), в то время как другие вещи все еще работали. Удаление производных данных, перезагрузка и т.д. - ничего не работало.

Мое решение получило:

  • Закрыть проект xcode
  • Удалить производные данные для проекта (Window- > Projects)
  • Переименуйте всю папку проекта/источника, т.е. проект → проект-1
  • (обновляйте закладки для управления исходным кодом, например, sourcetree)
  • Открыть проект в xcode (от finder): обратите внимание, что раскадровка и несколько других файлов находятся в красном цвете. Удалите ссылки, повторно добавьте их. Бум, он работает.

Обратите внимание, что удаление ссылки на раскадровку и ее чтение, даже с удаленными производными данными, было недостаточным. Мне было необходимо переименовать всю исходную папку.