iPhone Interface Builder中的自定义控件

时间:2011-07-06 22:14:57

标签: iphone ios interface-builder

这似乎是一个常见的问题,但我没有看到它清楚或简洁地回答 - 因此我无法使其正常工作。

我在Interface Builder中创建了一个Widget.xib文件。它包括:

View (UIView)
  ImageView (UIImageView)
  Button (UIButton)
  Label (UILabel)

我创建了Widget.h和Widget.m,它们实现了类Uidget,它派生自UIView。在Interface Builder中,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发布了这四个对象。在Interface Builder中,按钮,标签,视图和图像视图都连接到相应的IBOutlets。

回到Interface Builder,我从项目中打开了另一个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中合成并发布。在Interface Builder中,Playfield.xib显示了放置小部件的三个空矩形,这正是我所期望的。这些连接到Playfield.h中相应的IBOutlets。

所以,在这一点上,我认为一切都准备好了。在Playfield.m的viewDidLoad中,我这样做:

self.widget0.label.text = @“喂我”;

在我看来,它引用了Playfield.h中声明的widget0 IBOutlet。它连接到Playfield.xib中的第一个Widget项。反过来,它在Widget.xib和Widget.h中有一个声明的标签IBOutlet。 UILabel具有Text属性。因此,它应该更改小部件中标签上的文本。

但事实并非如此。我做错了什么?

(我想强调一点,我不打算制作一个Interface Builder插件。我知道那些很复杂。在IB中,我很好地将我的Widgets操作为空矩形。我还会注意到我已经将Widget.xib中的小部件视图的背景颜色设置为白色。当我运行项目时,我可以清楚地看到playfield图形顶部的白色矩形,所以我知道小部件在那里“就在那里。我只是可以”似乎可以访问它们。)

3 个答案:

答案 0 :(得分:1)

您从哪里调用loadNibNamed:owner:options:方法从Widget.XIB加载Widget子视图?

此外,您确实将Widget.XIB文件中的视图连接到文件所有者(这是一个Widget对象),因此IBOutlets已连接并允许您访问视图...但是您是否将视图作为子视图添加到您的小部件的数量

当您尝试使用self.widget0.label访问它时,插座是否为零?检查self.widget0是否不是nil(我猜是没关系),但self.widget0.label也不是nil(我猜这是真正的问题)。如果是,您可能忘记为每个小部件视图加载Widget.xib。如果不是,那么它可能意味着您拥有标签,但它不会添加到视图层次结构中。

答案 1 :(得分:0)

您对XIB设置的描述未提及Widget上的label插座实际连接到XIB中的标签。检查一下,也许吧?听起来好像你已经设置了其他所有东西,尽管你不需要在实例变量上声明IBOutlet属性,只需要声明属性。

答案 2 :(得分:0)

我常常想到的一个常见问题是在IB中将类类型设置为widget。

A screenshot of Widget Class Selected in IB