Пользовательский элемент управления в iPhone Interface Builder - PullRequest
0 голосов
/ 07 июля 2011

Похоже, это общий вопрос, но я не видел, чтобы на него отвечали четко или лаконично - и поэтому у меня возникли проблемы с его работой.

Я создал файл 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, на белый. Когда я запускаю проект, я ясно вижу белые прямоугольники на графике игрового поля, так что я знаю, что виджеты там "внутри". кажется, к ним нет доступа.)

Ответы [ 3 ]

1 голос
/ 07 июля 2011

Где вы вызвали метод loadNibNamed:owner:options: для загрузки ваших подпредставлений виджетов из вашего Widget.XIB?

Также вы связали свои представления в файле Widget.XIB с владельцем файла (который является виджетом).объект), поэтому IBOutlets подключены и дают вам доступ к представлениям ... но добавили ли вы представления в качестве подпредставления к своим виджетам?

Является ли розетка нулевой, когда вы пытаетесь получить к ней доступ, используя self.widget0.label?Проверьте, не является ли self.widget0 не nil (я полагаю, это нормально), но также, если self.widget0.label тоже не nil (я полагаю, что это реальная проблема).Если это так, вы, вероятно, забыли загрузить свой Widget.xib для каждого вида виджета.Если это не так, то это, вероятно, означает, что у вас есть ярлык, но он не добавлен в иерархию представлений.

0 голосов
/ 07 июля 2011

Я часто скучаю по типу виджета в IB.

A screenshot of Widget Class Selected in IB

0 голосов
/ 07 июля 2011

В вашем описании вашей установки XIB нет упоминания о том, что розетка label на Widget фактически подключена к ее метке в XIB.Проверьте это, может быть?Звучит так, как будто вы настроили все остальное, хотя вам не нужно объявлять атрибут IBOutlet в переменной экземпляра, только свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...