7

我对自定义 UITableViewCell 以及如何使用情节提要管理事物有一些问题。当我把样式代码放进去时initWithCoder:它不起作用,但如果我把它放进去tableView: cellForRowAtIndexPath:它就起作用了。在情节提要中,我有一个原型单元格,其类属性设置为我的 UITableViewCell 自定义类。现在initWithCoder:确实调用了其中的代码。

SimoTableViewCell.m

@implementation SimoTableViewCell

@synthesize mainLabel, subLabel;

-(id) initWithCoder:(NSCoder *)aDecoder {
    if ( !(self = [super initWithCoder:aDecoder]) ) return nil;

    [self styleCellBackground];
    //style the labels
    [self.mainLabel styleMainLabel];
    [self.subLabel styleSubLabel];

    return self;
}

@end

表视图控制器.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"NearbyLandmarksCell";
    SimoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    //sets the text of the labels
    id<SimoListItem> item = (id<SimoListItem>) [self.places objectAtIndex:[indexPath row]];
    cell.mainLabel.text = [item mainString];
    cell.subLabel.text = [item subString];

    //move the labels so that they are centered horizontally
    float mainXPos = (CGRectGetWidth(cell.contentView.frame)/2 -      CGRectGetWidth(cell.mainLabel.frame)/2);
    float subXPos = (CGRectGetWidth(cell.contentView.frame)/2 - CGRectGetWidth(cell.subLabel.frame)/2);
    CGRect mainFrame = cell.mainLabel.frame;
    mainFrame.origin.x = mainXPos;
    cell.mainLabel.frame = mainFrame;
    CGRect subFrame = cell.subLabel.frame;
    subFrame.origin.x = subXPos;
    cell.subLabel.frame = subFrame;

    return cell;
}

我调试了代码,发现dequeue...先调用了,然后进入了initWithCoder:,再回到视图控制器代码。奇怪的是,内存中单元的地址return self;在它返回控制器之间和之间发生变化。dequeue...如果我在一切正常之后将样式代码移回视图控制器。只是我不想在重用单元格时做不必要的样式。

干杯

4

1 回答 1

13

在对单元格调用之后initWithCoder:,将创建单元格并设置其属性。但是,单元格上的 XIB(IBOutlets)中的关系尚未完成。因此,当您尝试使用时mainLabel,它是一个nil参考。

将您的样式代码移动到awakeFromNib方法中。在解压 XIB 后创建和完全配置单元后调用此方法。

于 2013-06-06T06:43:47.703 回答