这似乎是一个常见的问题,但我没有看到它清楚或简洁地回答 - 因此我无法使其正常工作。
我在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图形顶部的白色矩形,所以我知道小部件在那里“就在那里。我只是可以”似乎可以访问它们。)
答案 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。