Похоже, это общий вопрос, но я не видел, чтобы на него отвечали четко или лаконично - и поэтому у меня возникли проблемы с его работой.
Я создал файл Widget.xib в Интерфейсном Разработчике. Он состоит из:
View (UIView)
ImageView (UIImageView)
Button (UIButton)
Label (UILabel)
Я создал Widget.h и Widget.m, которые реализуют класс Widget, производный от UIView. В Интерфейсном Разработчике Widget.xib имеет своего Владельца Файла, установленного на класс Widget.
Widget.h выглядит так:
@interface IconView : UIView {
IBOutlet UIButton *widgetButton;
IBOutlet UILabel *widgetLabel;
IBOutlet UIView *widgetView;
IBOutlet UIImageView *widgetImage;
}
@property (nonatomic, retain) IBOutlet UIButton *widgetButton;
@property (nonatomic, retain) IBOutlet UILabel *widgetLabel;
@property (nonatomic, retain) IBOutlet UIView *widgetView;
@property (nonatomic, retain) IBOutlet UIImageView *widgetImage;
Widget.h включает в себя:
@synthesize widgetButton, widgetLabel, widgetView, widgetImage;
И его dealloc освобождает эти четыре объекта. В Интерфейсном Разработчике кнопка, метка, представление и просмотр изображения все связаны с соответствующим IBOutlets.
Вернувшись в Интерфейсный Разработчик, я открыл еще одну XIB из проекта. Это Playfield.xib. Это более традиционный вид, поддерживаемый PlayfieldViewController.h и .m. Содержит:
View (UIView)
ImageView (with a static graphic) (UIImageView)
Button (UIButton)
Widget
Widget
Widget
В Playfield.h я создал IBOutlets для кнопки и трех виджетов.
@interface LinkViewController : UIViewController {
IBOutlet UIButton *buttonBack;
IBOutlet Widget *widget0;
IBOutlet Widget *widget1;
IBOutlet Widget *widget2;
}
@property (nonatomic, retain) IBOutlet Widget *widget0;
@property (nonatomic, retain) IBOutlet Widget *widget1;
@property (nonatomic, retain) IBOutlet Widget *widget2;
- (IBAction)buttonBackClicked:(id)sender;
Они также синтезируются и выпускаются в Playfield.h. В Интерфейсном Разработчике Playfield.xib показывает три пустых прямоугольника, где размещены виджеты, что я и ожидал. Они подключены к соответствующим IBOutlets в Playfield.h.
Итак, на данный момент я предполагаю, что все готово к работе. В представлении Playfield.mDidLoad я делаю это:
self.widget0.label.text = @ "Накорми меня";
По-моему, это ссылка на IBOutlet widget0, объявленный в Playfield.h. Это связано с первым элементом виджета в Playfield.xib. Это, в свою очередь, имеет объявленный ярлык IBOutlet в Widget.xib и Widget.h. UILabel имеет свойство Text. Поэтому следует изменить текст на метке внутри виджета.
Но это не так. Что я делаю не так?
(Хочу подчеркнуть, что я не собираюсь создавать плагин Interface Builder. Я знаю, что это сложно. В IB я прекрасно управляю своими виджетами в виде пустых прямоугольников. Также отмечу, что я установите цвет фона для Виджета, в Widget.xib, на белый. Когда я запускаю проект, я ясно вижу белые прямоугольники на графике игрового поля, так что я знаю, что виджеты там "внутри". кажется, к ним нет доступа.)