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

Как получить доступ к IBOutlets, объявленному в суперклассе?

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

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

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

(Просто для удовольствия, вот мой заголовок заголовка суперкласса :)

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

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

-(IBAction) buyFullVersion;

@end

EDIT: в случае, если кто-то задается вопросом, я использую Xcode и IB 3.2.5 с iOS 4.2 SDK.

4b9b3361

Ответ 1

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

Насколько я могу судить, вы не можете подключиться к выходам в суперклассе, используя помощник редактора, но вы можете сделать это, нажав "File Owner" в IB. Это должно показать все выходы в Utilities- > Connections Inspector. Затем вы можете нажать Ctrl + щелкнуть на выходе в инспекторе (нажать на знак "+" ) и перетащить его на свой вид в IB.

Ответ 2

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

enter image description here

подключиться с помощью Control + drag and drop и

enter image description here

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

enter image description here

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

BTW: я использовал Xcode 6

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

В Конструктор интерфейсов:

  • Выберите элемент, который вы хотите подключить.
  • Перейдите в Утилиты Идентификационный инспектор
  • Измените класс на ваш подкласс (или суперкласс). ПРИМЕЧАНИЕ. Возможно, вам придется ввести имя подкласса и нажать ENTER.

Вы закончили!

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

// YourViewController.h

@interface YourViewController : UIViewController {

IBOutlet UIButton *mybutton;
}

... класс, который вы установили в Interface Builder (ShadowButton), перезапишет его, поскольку он находится на уровне представления.

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

Ответ 8

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

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

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

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

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

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

Ответ 9

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

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

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

Ответ 10

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

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

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