自定义UIView与自定义XIB:IBOutlets无法正常工作

时间:2012-02-06 17:53:12

标签: ios cocoa-touch uiview xib

我正在使用最新的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。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

我前一段时间遇到了同样的问题。以下是我要解决的问题:

  1. 在xib中,打开文档大纲(左侧窗格,显示视图列表及其子视图等)。
  2. 左侧控制单击代表您的类的视图(在您的情况下为CoordinateView)并将蓝线向下拖动到子视图(在您的情况下,UILabel称为标题)
  3. 然后XCode会弹出一个带有“title”选项的小对话框(因为你的标签叫做title。)
  4. 点击标题和wallaa。
  5. 返回调试并检查您的商店是否仍为零。
  6. 仅仅是个人偏好(不一定与讨论主题相关):我会将你的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中的更多信息。