Проблема с XCode и Interface Builder: не удается подключить элементы пользовательского интерфейса через IBOutlet

#objective-c #xcode

#objective-c #xcode

Вопрос:

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

Теперь это не так. Не уверен, как это исправить.

Комментарии:

1. Теперь отображается только «делегировать».

Ответ №1:

«… обычно я мог щелкнуть ctrl и перетащить к «Владельцу файла»»

После добавления дополнительных IBOutlet элементов в ваш класс контроллера вы обычно устанавливаете их в Interface Builder, перетаскивая из объекта controller в элемент view, а не наоборот. (Здесь объектом контроллера обычно является File's Owner «Приложение» или созданный пользовательский объект контроллера).

Реже вы можете перетащить из самих представлений в объект (ы) контроллера или в другие объекты представления, чтобы задать такие IBOutlet объекты для конкретного класса, как delegate , и / или dataSource , menu , formatter и т.д. Например, NSTextField добавляет a delegate и a formatter IBOutlet к NSView ‘s menu и nextKeyView IBOutlet s.

Итак, вы можете захотеть дважды проверить, что вы перетаскиваете в правильном направлении для рассматриваемого объекта.

Если вы знаете, что перетаскиваете в правильном направлении, а Interface Builder работает не так, как обычно, есть пара вещей, которые вы могли бы попробовать.

Во-первых, если вы добавили дополнительные IBOutlets в свой класс контроллера и пытаетесь подключить их в Interface Builder, дважды проверьте, действительно ли вы указали правильный класс для нужного вам объекта view. Например, чтобы добавить новый IBOutlet, я иногда копирую существующую строку, скажем IBOutlet NSTextField *textField; , а затем вставляю ее. Затем я бы изменил имя на tableView (с намерением IBOutlet подключиться к NSTableView ), но я забуду изменить NSTextField на NSTableView . Поэтому, когда я захожу в Interface Builder и пытаюсь «подключить» IBOutlet, перетаскивая из класса контроллера в NSTableView , всплывающее меню не отображается, поскольку табличное представление и текстовое поле — это два разных вида объектов.

Во-вторых, вы могли бы опубликовать содержимое вашего файла .h. Возможно, вы забыли ; или иным образом создали возможную ситуацию, которая приводит к неполному завершению синтаксического анализа файла .h (с помощью Xcode, который затем передает результаты в Interface Builder). Когда это происходит, это может помешать отображению многих IBOutlets и т.д. В IB. Вы также можете попробовать скомпилировать свой код как есть, чтобы помочь выяснить, в чем кроются проблемы. Я иногда делал это сам.

Ответ №2:

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

Если вы видите правильные выходы в инспекторе и по-прежнему не получаете желаемого поведения ctrl click, я бы попробовал повторно открыть ваш проект, перезапустить XCode или найти удалить файл XCode prefs.

Удачи!

Комментарии:

1. Я получаю «Новый ссылочный выход».

Ответ №3:

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

  1. Я добавил файл TableViewController в проект Xcode.
  2. Я добавил соответствующие свойства IBOutlet в соответствующий файл заголовка.
  3. Я добавил TableViewController в IB.
  4. Я добавил элементы управления в TableView в IB.

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