自定义UITableViewCell既可以与NIB一起使用,也可以以编程方式使用

时间:2013-09-12 11:48:59

标签: ios uitableview

免责声明:我是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。问题是属性lblTitleimgIcon未设置,因为它们未初始化,我无法初始化它们,因为它们是出口和weak

我需要知道在这种情况下正确的方法是什么。

3 个答案:

答案 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方法,因为您的出口已经由故事板本身初始化。

此致 佛瑞德