我有一个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相关联的最佳方法是什么?
答案 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)
有两种方法可以初始化视图:
从storyboard / xib加载
在这种情况下,当您想要访问代码中的视图时,您需要IBOutlet
按代码
初始化在这种情况下,您根本不需要IBOutlet
@property (nonatomic, strong) MyCustomView *customerView1