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


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

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

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

22 52

22 ответа:

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

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

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

enter image description hereenter image description hereenter image description here

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

  1. проверьте, что файл, реализующий класс, является частью собрать фаз (регистрация по цель>собрать фаз)
  2. добавить до собрать фаз (если уже не).
  3. Перезапустить Xcode.

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

  1. щелкните правой кнопкой мыши My.storyboard запись в Проект Навигатор панели и выберите Открыть Как->Исходный Код выбор меню. Найдите запись контроллера вида в XML и добавьте атрибут customClass="MyController".

  2. сохранить раскадровку.

  3. щелкните правой кнопкой мыши My.storyboard запись в Проект Навигатор панель снова, и выберите Открыть Как - > Interface Builder-Storyboard выбор меню.

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

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

@interface ClassName : UIViewController

у меня были те же проблемы, как описано в этой задаче. Однако ни один из предложенных ответов не исправил его для меня. Мой проект скомпилирован ОК без предупреждений или ошибок, но, в том .H файл не было никаких индикаторов "розетки", чтобы указать, что мои розетки были связаны с элементами раскадровки.

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

и все же, проект скомпилирован ок.

@interface KJBMainDataViewTrackConMk2<UIScrollViewDelegate> : UIViewController

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

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

@interface KJBMainDataViewTrackConMk2 : UIViewController<UIScrollViewDelegate>

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

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

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

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

vs:

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

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

я исправил это двумя различными способами. Один путь был мимо я открыл .pbxproj файл и исправление вопроса с учетом регистра вручную. Другой способ, который работал, состоял в том, чтобы нажать значок папки под разделом Identity и Type вкладки File Inspector файла и повторно выбрать файл там.

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

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

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

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

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

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

  1. после добавления нового viewcontroller в раскадровку (просто перетащив его)
  2. и добавление моего класса по File\New\File\Objective-C Class, дайте ему имя, нет XIB, далее, Create

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

но

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

А ТО

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

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

убедитесь, что вы выбрали контроллер вида, к которому хотите прикрепить свой класс. Самый простой способ это открыть Document Outline и выберите свой контроллер вида (когда вы нажимаете на него, образуя раскадровку, иногда он просто не выбирает объект, который вы имели в виду).

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

  1. просто скопируйте свой код где-нибудь еще.(Допустим на рабочем столе)
  2. откройте существующий код.
  3. удалите файл пользовательского класса.(Переместить в корзину)
  4. Теперь добавьте файлы из скопированной папки проекта (из рабочего стола)
  5. не забудьте установить флажок "копировать при необходимости"
  6. откройте доску истории и бинго вы получите ваши пользовательские файлы класса в выпадающем меню

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

Фазы Сборки - > Добавить Фазу Сборки - > Копировать Ресурсы Пакета найдите свой файл Затем перетащите ваш файл туда

затем убедитесь, что ваша целевая членство.

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

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

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

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

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

изменить с

import Cocoa

class AppsViewController: NSObject {

}

до

import Cocoa

class AppsViewController: NSViewController {

}

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

class MyCustomNameViewController: UIViewController {
.
.
} 

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