Подтвердить что ты не робот

Storyboard uiviewcontroller, "пользовательский класс" не отображается в раскрывающемся списке

У меня есть UIViewController, который я создал в раскадровке моих приложений, а также пользовательский подкласс UIViewController, который я добавил в проект (и правильно на этапе компиляции для моей цели). Однако, когда я собираюсь установить свойство "Пользовательский класс" на контроллере представления в Storyboard, мой пользовательский класс не отображается в списке.

  • Проверено, что класс является частью моей целевой программы, а не тестами
  • Double проверил, что это правильно подкласс UIViewController
  • Скомпилированная программа, чтобы убедиться, что xcode работает с последней информацией.
  • Перезагруженный xcode

Что может привести к тому, что мой класс не появится в раскрывающемся списке "Пользовательский класс"?

4b9b3361

Ответ 1

Два способа найти решение проблемы, но они работают. 1. Просто введите имя диспетчера представлений в текстовое поле или 2. закройте проект, а затем снова откройте его и в инициализации проекта он поместит файл в список.

Ответ 2

Если у вас все еще есть проблема или у тех, у кого может быть такая же проблема:

Обязательно выберите в своем раскадровке свой "ViewController" вместо "View" (который автоматически выбирается при нажатии на просмотр в раскадровке). Разница между этими двумя заключается в том, что когда выбран контроллер просмотра, вокруг вашего приложения появляется синий прямоугольник. Чтобы выбрать контроллер вида, откройте контур документа и выберите его прямо в иерархии раскадровки.

enter image description hereenter image description hereenter image description here

Ответ 3

Я бы попробовал следующее:

  1. Убедитесь, что файл, реализующий этот класс, является частью фаз сборки (проверка по этапам target > build)
  2. Добавьте файл .m для построения фаз (если его еще нет).
  3. Перезапустите Xcode.

Ответ 4

Вы можете исправить это, отредактировав XML своей раскадровки.

  • Щелкните правой кнопкой мыши по вашей записи My.storyboard на панели "Навигатор проекта" и выберите пункт "Открыть As- > SourceCode". Найдите запись в контроллере представления в XML и добавьте атрибут customClass="MyController".

  • Сохраните раскадровку.

  • Снова щелкните правой кнопкой мыши на вашей записи My.storyboard на панели "Навигатор проекта" и выберите "Открыть как > " - "Конструктор интерфейса - раскадровка".

Пользовательская запись класса теперь будет содержать ваше имя класса MyController.

Ответ 5

Убедитесь, что ваш класс наследуется от UIViewController.

@interface ClassName : UIViewController

Ответ 6

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

MyProject/mysubdirectory/MyViewController.xib (.m, .h)

vs:

MyProject/mysubdirectory/MyViewController.xib (.m, .h)

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

Я исправил это два разных способа. Один из способов был: я открыл файл .pbxproj и исправил проблему, чувствительную к регистру, вручную. Другой способ, который работал, - щелкнуть значок папки в разделе "Идентификация и тип" на вкладке "Инспектор файлов" файла и повторно выбрать файл там.

Ответ 7

У меня были те же проблемы, что и в этой проблеме. Однако ни один из предложенных ответов не исправил это для меня. Мой проект скомпилирован без предупреждений или ошибок, но в файле .h не было индикаторов "выхода", указывающих на то, что мои выходы были связаны с элементами раскадровки.

Кроме того, попытки создания новых точек в моем коде, щелкнув правой кнопкой мыши и перетащив в мой заголовочный файл, не распознали мой источник заголовка как потенциальную цель для этой операции. Кроме того, мой класс не появился в раскрывающемся списке Custom-Class для панели инспектора свойств ViewController.

И все же проект скомпилирован в порядке.

Более тщательное обследование показало, что я определил свой класс следующим образом...

@interface KJBMainDataViewTrackConMk2<UIScrollViewDelegate> : UIViewController

который, по-видимому, компилируется красиво.

Но если это будет изменено на следующее (перемещение протоколов до конца)...

@interface KJBMainDataViewTrackConMk2 : UIViewController<UIScrollViewDelegate>

Тогда все оживает. Все выходы внезапно обозначаются как "связанные" с элементом раскадровки. И перетаскивание правой кнопкой мыши снова начнет работать, и мой пользовательский класс появится в раскрывающемся списке пользовательского класса на панели инспектора свойств для раскадровки ViewController!

Другие ответы здесь, вероятно, являются наиболее вероятными причинами этого состояния, но я чувствовал, что стоит упомянуть хотя бы эту еще одну потенциальную причину.

Ответ 8

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

Ответ 9

У меня была та же проблема, но ни один из других решений не работал у меня. Проблема для меня заключалась в том, что у меня была цель Mac и iOS, как со своими версиями одного и того же контроллера. Например, у меня была пара файлов .h/.m с именем FooViewController для Mac и другая .h/.m пара файлов с именем FooViewController для iOS. Каждая пара была правильно включена в их соответствующие цели, но по какой-то причине Xcode не нравится, и мой контроллер просмотра не будет отображаться в раскрывающемся списке Custom Class в контроллере представления в раскадровке. В итоге я переименовал свой класс в контроллер представления iOS, и он сразу появился в раскрывающемся списке.

Ответ 10

В моем случае я перетаскиваю новый объект TableViewController в раскадровку, но добавляю новый файл, подклассом которого является "UIViewController".... Затем я добавляю файл, подклассом которого является "UITableViewController", проблема решена!

Ответ 11

Мне довелось столкнуться с этой проблемой и не повезло, попробовав предыдущие предложения. Наконец, я обнаружил, что тип файла заголовка установлен на C++ header. После изменения его на C header (как и все другие файлы заголовков) класс появляется в списке. Не знаю, почему, хотя... Возможно, полезно для других, поэтому я размещаю его здесь.

Ответ 12

Для тех из вас, кто все еще испытывает эту проблему после того, как ViewController все вокруг, возможно, потому что вы нажали View вместо ViewController.

Вы должны выбрать файл при нажатии ViewController.

Это решило мою проблему.

enter image description here

Ответ 13

сначала не добавляйте CustomViewController в любую группу или папку. поместите его в корень вашего приложения.

Ответ 14

Ни один из вышеперечисленных (или ниже:) не помог мне. хотя я обнаружил, что

  • после добавления нового диспетчера представлений в раскадровку (просто перетащив его)
  • и добавление моего класса с помощью файла \New\File\ Objective-C класса, дайте ему имя, не XIB, Next, Create

если я выберу свой viewcontroller в раскадровке и попытаюсь присвоить ему свой класс - мой класс не существует

НО

если я нажму на представление, которое находится в самом представлении управления, затем щелкните раскрывающееся меню класса в пользовательском классе

И ТОГДА

выберите viewcontroller (нажмите на панель под диспетчером просмотра), а теперь снова щелкните раскрывающийся список класса в пользовательском классе, который появился в моем новом добавленном классе.

странно, должно быть, ошибка с освежающим. Версия Xcode 5.1 (5B130a)

Ответ 15

Убедитесь, что вы выбрали View Controller, к которому вы хотите присоединить свой класс. Легкий способ открыт Document Outline и выбрать ваш контроллер представления (когда вы нажимаете на него, формальная раскладка иногда просто не выбирает объект, который вы имели в виду).

Ответ 16

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

  • Просто скопируйте код где-нибудь еще (скажем, на рабочем столе)
  • Откройте существующий код.
  • Удалить пользовательский файл класса. (Переместить в корзину)
  • Теперь добавьте файлы из скопированной папки проекта (с рабочего стола)
  • Не забудьте установить флажок "Скопировать, если необходимо"
  • Откройте панель рассказов и бинго, и вы получите свои собственные файлы классов в раскрывающемся меню.

Ответ 17

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

Фазы сборки → Добавить фазу сборки → Скопировать ресурсы Bundle найти файл Затем перетащите туда файл

Затем убедитесь, что ваше целевое членство проверено.

Ответ 18

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

Ответ 19

Мне пришлось перезапустить XCode 7.3 (7D175)

Ответ 20

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

Ответ 21

Попробуйте очистить проект, а также перезагрузите Mac. Одна из особенностей, которую я сделал, - это изменить все имена пользовательских классов и снова создать проект. Это сработало!

Ответ 22

Для проектов macOS создание нового класса генерирует класс, наследуемый от NSObject вместо этого на NSViewController.

Меняться от

import Cocoa

class AppsViewController: NSObject {

}

в

import Cocoa

class AppsViewController: NSViewController {

}

Ответ 23

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

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

class tableViewCell: UITableViewCell { 
}
class collectionCell: 


class viewController: UIViewController {
     override func viewDidLoad(){
     super.viewDidload()

     }

}

Обратите внимание на неполный кодовый блок collectionCell2 Этого было достаточно для xcode, чтобы не распознавать мой файл viewController как таковой. Как только я закончил этот блок, файл снова появился в моем xcode как опция.

Очень глупо и просто.

Ответ 24

Убедитесь, что имя класса ViewController - это имя, которое вы хотите. т.е.

class MyCustomNameViewController: UIViewController {
.
.
} 

Изменение имени файла недостаточно.