Как получить доступ к IBOutlets, объявленным в суперклассе? - PullRequest
14 голосов
/ 13 декабря 2010

В настоящее время я занимаюсь рефакторингом пары контроллеров представления, которые используют несколько методов IBOutlet s и IBAction.Я переместил объявления розеток и метод IBAction в суперкласс, вырезав их из подклассов.

Теперь, когда я открываю Интерфейсный конструктор, я обнаруживаю, что не вижу объявленных розеток или действийв суперклассе.Соединения все еще существуют, так как я подключил их перед рефакторингом, но они неактивны.(Важно отметить, что соединения также работают, так как мое действие запускается при нажатии кнопки, и мои розетки корректно модифицируются.)

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

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

@interface TFMainViewController : UIViewController {
    UIImageView *logoImage, *thinkfunImage;
    UIButton *buyFullButton;        
}

@property (nonatomic, retain) IBOutlet UIImageView *logoImage, *thinkfunImage;
@property (nonatomic, retain) IBOutlet UIButton *buyFullButton;

-(IBAction) buyFullVersion;

@end

РЕДАКТИРОВАТЬ: если кому-то интересно, яиспользую Xcode и IB 3.2.5, с iOS 4.2 SDK.

Ответы [ 10 ]

20 голосов
/ 06 ноября 2012

Я не осознавал, что можно было даже подключиться к суперклассам в конструкторе интерфейсов примерно час назад.Поскольку это был единственный вопрос, который я мог найти относительно того, как это сделать, я добавлю свой ответ, даже если этот вопрос старый.Мой ответ касается Xcode 4, а не Xcode 3.

Насколько я могу сказать, вы не можете подключиться к розеткам в суперклассе с помощью помощника редактора, но вы можете сделать это, нажавВладелец файла "в IB.Это должно показать все розетки в утилитах-> Инспектор соединений.Затем вы можете нажать Ctrl + клик по розетке в инспекторе (щелкнуть по знаку «+») и перетащить ее в поле зрения в IB.

14 голосов
/ 13 октября 2014

Решение проблемы с IBOutlet .. состоит в том, чтобы изменить тип класса на Базовый класс в инспекторе идентификации

enter image description here

, используя Control + drag and drop и

enter image description here

изменить его обратно на дочерний класс

enter image description here

Это работает для меня

Кстати: яб Xcode 6

3 голосов
/ 28 февраля 2013

Переключение между суперклассом и подклассом в инспекторе идентичности позволяет вам соединять ваши розетки между классами. Единственная проблема, которую я обнаружил, - это когда вы пытаетесь сделать это с UITableViewCell и его подклассом. Я хотел переназначить экземпляры textLabel и detailTextLabel по умолчанию меткам, которые я создаю в Интерфейсном Разработчике. Обходной путь - создать замещающие метки, а затем переопределить геттеры, чтобы указывать на них.

3 голосов
/ 13 декабря 2010

IB должен видеть выходы из суперклассов, я делал это несколько раз без проблем.Вы уверены, что импортируете суперкласс правильно (используя #import вместо @class)?IB нужен какой-то способ отследить суперкласс.

0 голосов
/ 14 января 2017

У меня была такая же проблема, и оказалось, что это произошло из-за того, что в суперклассе IBOutlets были объявлены как "_Nullable". Пример:

@property (nonatomic, strong)   IBOutlet UITableView *_Nullable mySuperTableView;

Когда я удалил _Nullable, вдруг IBOutlets снова появились в IB, и все снова было хорошо. (Я только установил их в _Nullable, потому что Xcode жаловался на то, что «в указателе отсутствует спецификатор типа обнуляемости» ... (не знаю почему).)

0 голосов
/ 12 января 2017

Я столкнулся с подобной проблемой с суперклассом, но это было из-за ошибки в Xcode (8.2), когда Interface Builder не показывает выходы в Инспекторе соединений, если эти выходы были объявлены с аннотацией типа _Nullableдля совместимости с Swift.

Использование nullable в скобках @ свойства, по-видимому, решает проблему.

Эта ошибка XCode, похоже, влияет на выходы в любом классе (т. е. не только в суперклассах).1007 *

0 голосов
/ 18 сентября 2015

В проекте, над которым я сейчас работаю, у нас есть BaseViewController с UIScrollView в качестве IBOutlet, который обрабатывает события появления / исчезновения клавиатуры и соответственно перемещает содержимое.Сначала я не мог подключиться к этому IBOutlet, чем решил проблему, подобную этой, что похоже на ответ Сосили:

  • BaseViewController имеет IBOutlet, называемый contentScrollView.Я вижу 5 ранее подключенных розеток, UIScrollViews на других UIViewControllers, созданных людьми, которые ранее работали над проектом

  • Я пытался подключить свой UIScrollView какcontentScrollView.Хотя мой UIViewController является подклассом BaseViewController, я не могу подключить его.

  • Я попытался подключить уже подключенный UIScrollViews как contentScrollView.Хотя все UIViewControllers являются подклассами BaseViewController, я также не могу подключить их снова.Итак, я начал искать трюк.

  • Я создал тот же contentScrollView IBOutlet самостоятельно UIViewController, подключил scrollView к своему contentScrollView розетка и убрал тот, который я только что создал.

  • Теперь scrollView подключен как contentScrollView к владельцу файла, но единственный contentScrollView принадлежит BaseViewController.Протестировано и проверено, что события клавиатуры обрабатываются правильно.

0 голосов
/ 25 февраля 2013

Самый простой способ: создать интерфейс и файлы реализации для вашего подкласса (ов)!
Прекрасный пример: Juggleware's потрясающий ShadowButton Subclass UIButton.

Убедитесь, что в вашем проекте созданы файлы .h & .m.ПРИМЕЧАНИЕ. Нет необходимости #import заголовочных файлов, поскольку это просто экземпляр класса UIButton.

В Интерфейсный Разработчик :

  1. Выберите элемент для подключения.
  2. Перейдите к Утилиты -> Identity Inspector
  3. Измените класс на свой подкласс (или суперкласс).ПРИМЕЧАНИЕ. Возможно, вам придется ввести имя своего подкласса и нажать клавишу ВВОД.

Готово!

Даже если вы объявили базовый класс (UIButton) как IBOutlet в своемзаголовочный файл примерно такой ...

// YourViewController.h

@interface YourViewController : UIViewController {

IBOutlet UIButton *mybutton;
}

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

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

0 голосов
/ 02 февраля 2013

Я делаю это в XCode 3.2.6.Я начал с розеток, связанных с классом, а затем создал подкласс с дополнительными розетками.Когда я изменил класс Владельца Файла на подкласс, IB показал, что выходы суперкласса выделены серым цветом.Я переключил Владельца Файла на суперкласс, затем вернулся к подклассу, и теперь все выходы отображаются не серыми.

0 голосов
/ 13 декабря 2010

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

...