IBOutlets和自定义视图

时间:2014-09-16 07:35:43

标签: ios objective-c iphone uiview

我有一个UIViewController需要5个子视图,其中包含UIImageView和文本UILabel。

我想将这些作为IBOutlet,所以请注意以下内容:

@property (nonatomic, weak) MyCustomView *customerView1
@property (nonatomic, weak) MyCustomView *customerView2
etc

然后我有以下类在代码中创建这些自定义视图:

#import "MyCustomView.h"

@implementation MyCustomView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        //[self setupView:frame andKeyColor:color];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame andKeyColor:(UIColor *)color
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [self setupView:frame andKeyColor:color];
    }
    return self;
}

- (void)setupView:(CGRect)frame andKeyColor:(UIColor *)color
{
    UIImageView *colorKeySquare = [self createColorKeySquare:frame andKeyColor:color];
    [self addSubview:colorKeySquare];

    UILabel *titleTextLabel = [self createTitleLabel:colorKeySquare.frame];
    self.titleText = titleTextLabel;
    [self addSubview:self.titleText];
}

- (UIImageView *)createColorKeySquare:(CGRect)frame andKeyColor:(UIColor *)color
{
    CGPoint point = CGPointMake(frame.origin.x, frame.origin.y);
    CGSize size = CGSizeMake(20, 20);
    UIImageView *colorKeySquare = [[UIImageView alloc] initWithFrame:CGRectMake(point.x, point.y, size.width, size.height)];

    [colorKeySquare setBackgroundColor:[UIColor redColor]];

    return colorKeySquare;
}

- (UILabel *)createTitleLabel:(CGRect)frame
{
    CGPoint point = CGPointMake(CGRectGetMaxX(frame), frame.origin.y);
    CGSize size = CGSizeMake(self.frame.size.width - frame.size.width, frame.size.height);
    UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(point.x, point.y, size.width, size.height)];

    return textLabel;
}

@end

我已正确地搞定了一切。但是,当我在我的一个属性上访问UILabel时,它总是返回nil。 UILabel在任何时候都没有被分配。

如果执行以下操作:self.myCustomView1.titleLabel.text = @“Hello”;当我在调试器中打印对象时,我得到了这个:

Printing description of self->_nationalKey->_titleText:

在代码中设置自定义视图并将其与IBOutlet相关联的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我不知道您何时致电initWithFrame:andKeyColor:但是UIView initWithFrame:中有两个主要的初始化程序,在您以编程方式创建视图时调用,initWithCoder:在创建视图时调用在xib / storyboard中。

在您的示例中,您应该覆盖initWithCoder:

- (id)initWithCoder:(NSCoder*)aDecoder 
{
    self = [super initWithCoder:aDecoder];
    if (self)
    {
        [self setupControls];
    }

    return self;
}

答案 1 :(得分:0)

有两种方法可以初始化视图:

  1. 从storyboard / xib加载

    在这种情况下,当您想要访问代码中的视图时,您需要IBOutlet

  2. 按代码

    初始化

    在这种情况下,您根本不需要IBOutlet

    @property (nonatomic, strong) MyCustomView *customerView1