Как получить доступ к 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.
Ответы
Ответ 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"... (не знаю почему).