免责声明:我是iOS开发的新手。我正在为这个项目使用ARC
我有一个非常简单的自定义UITableViewCell
UITableViewListRightAlignedCell.h
@interface UITableViewListRightAlignedCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *lblTitle;
@property (weak, nonatomic) IBOutlet UIImageView *imgIcon;
@end
UITableViewListRightAlignedCell.m
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
[self initalize];
}
return self;
}
-(void)awakeFromNib {
[super awakeFromNib];
[self initalize];
}
-(void) initalize {
self.lblTitle.backgroundColor = [UIColor clearColor];
self.lblTitle.textAlignment = UITextAlignmentRight;
self.lblTitle.font = [UIFont fontWithName:FONTRobotoRegular size:16];
self.lblTitle.textColor = RGBColor(0x5D350BFF);
}
当我在故事板中有一个单元格时,此自定义单元格正常工作,我将UILabel
连接到lblTitle
,将UIImage
连接到imgIcon
。
但是,我希望在代码中的其他位置使用相同的自定义单元格类,并使用以编程方式创建的UITableView
。问题是属性lblTitle
和imgIcon
未设置,因为它们未初始化,我无法初始化它们,因为它们是出口和weak
。
我需要知道在这种情况下正确的方法是什么。
答案 0 :(得分:0)
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
[self createMyLabel:nil];// create your label here
// Initialization code
[self initalize];
}
return self;
}
-(void)awakeFromNib {
[super awakeFromNib];
[self initalize];
}
-(void) initalize {
//self.lblTitle.backgroundColor = [UIColor clearColor];
self.lblTitle.textAlignment = UITextAlignmentRight;
self.lblTitle.font = [UIFont fontWithName:FONTRobotoRegular size:16];
self.lblTitle.textColor = RGBColor(0x5D350BFF);
}
-(void)createMyLabel:(id)sender{
//Create your label
UILabel *MyLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 100)];
//Set background color for debugging
[storeAddress setBackgroundColor: [UIColor blueColor]];
//set this created label as your lblTitle label
[self setLblTitle:MyLabel];
//Add it to the cell's content view
[[self contentView] addSubview:[self lblTitle]];
//Then do something with that
//[self initalize];
//[MyLabel release]; // For Non ARC
}
答案 1 :(得分:0)
每个表格视图单元格都包含contentView。这个观点就是你在IB中看到的。当您在IB中添加控件(在您的情况下为UILabel)时,您可以将它们用作弱项,因为此contentView已经具有对它的强引用。那么你需要什么:
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[label setText:@"Test"];
[cell.contentView addSubview:label];
[cell setTitleLabel:label];
答案 2 :(得分:0)
您必须知道,在使用Storyboard时,只会调用awakeFromNib。只有在另一个类进行程序初始化的情况下才会调用initWithStyle。
因此,使用这种代码时你是对的:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
[self initalize];
}
return self;
}
-(void)awakeFromNib {
[super awakeFromNib];
[self initalize];
}
-(void) initalize {
// initialization code
}
这正是Paul Hegarty在斯坦福iOS课程中的表现。它确保无论调用者是什么,您的类都以一致的方式初始化。
因此,要回答您的问题,如果您想以编程方式使用此类,请仅在initWithStyle方法中添加此类代码(因为它是以编程方式调用的代码):
_lblTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[self.contentView addSubview:_lblTitle];
你的其他财产也一样。
当然,您不会将其添加到awakeFromNib方法,因为您的出口已经由故事板本身初始化。
此致 佛瑞德