我正在使用最新的SDK和XCode 4.2开发iOS应用程序。
我想在自定义UIView中使用自定义XIB。
我的自定义UIView:
@interface CoordinateView : UIView {
/**
*/
ARGeoCoordinate *geoCoordinate;
/**
*/
IBOutlet UILabel* title;
/**
*/
IBOutlet UILabel* subTitle;
/**
*/
IBOutlet UIImageView* image;
}
实现:
@implementation CoordinateView
@synthesize geoCoordinate;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code.
//
NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CoordinateView" owner:nil options:nil];
for(id currentObject in topLevelObjects)
{
if ([currentObject isKindOfClass:[CoordinateView class]])
{
[self addSubview:currentObject];
break;
}
}
}
return self;
}
- (id)initForCoordinate:(ARGeoCoordinate *)coordinate
{
self.geoCoordinate = coordinate;
CGRect theFrame = CGRectMake(0, 0, BOX_WIDTH, BOX_HEIGHT);
self = [self initWithFrame:theFrame];
if (self)
{
title.text = geoCoordinate.title;
image.image = [UIImage imageNamed:[NSString stringWithFormat:@"03%d.jpg", geoCoordinate.id]];
}
return self;
}
要初始化CoordinateView
我使用initWithCoordinate
方法。
调试我在title
内发现initWithCoordinate
为零:
title.text = geoCoordinate.title;
我使用Interface Builder来“链接”IBOutlets。
我做错了什么?
答案 0 :(得分:2)
我前一段时间遇到了同样的问题。以下是我要解决的问题:
仅仅是个人偏好(不一定与讨论主题相关):我会将你的UILabel称为'titleLabel'而不是'title',因为[objectInstance title]看起来会将NSString返回给不知道那个的人'title'是UILabel。只是个人偏好,就是这样。
干杯
答案 1 :(得分:1)
在initWithFrame:
方法中,您应该将self
分配给currentObject
,而不是将其添加为子视图。
此外,无需覆盖initWithFrame:
并调用super
方法,因为视图的布局由xib文件决定。
答案 2 :(得分:-3)
当视图完全加载时,将调用viewDidLoad
方法。因此,您应该在视图中初始化元素:
- (void)viewDidLoad {
title.text = self.geoCoordinate.title;
}
docs中的更多信息。