从自定义单元格加载UIImageView子类

时间:2013-09-10 21:41:34

标签: ios ios6 uitableview uiimageview

我不确定这是否是Storyboard Bug。我创建了一个带有自定义单元格的项目。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"HomeGameTurnCell";
    HomeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[HomeTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

自定义单元格包含一些图像视图。其中一个图像视图是子类。

@interface HomeTableViewCell : UITableViewCell

@property (strong, nonatomic) IBOutlet RoundedProfilePicture *profilePictureImageView;
@property (strong, nonatomic) IBOutlet UIImageView *turnThumbnailImage;
@property (strong, nonatomic) IBOutlet UILabel *usernameLabel;
@property (strong, nonatomic) IBOutlet UILabel *lastPlayedLabel;

@end

RoundedProfilePicture子类只具有以下内容:

-(id)init {
    NSLog(@"%s",__PRETTY_FUNCTION__);
    self = [super init];
    if (self) {
        [self setupView];
    }
    return self;
}

- (void)setupView
{
    NSLog(@"%s",__PRETTY_FUNCTION__);
    self.clipsToBounds = YES;
    self.layer.cornerRadius = self.bounds.size.width / 2;
    self.layer.borderWidth = 3;
    self.layer.borderColor = [UIColor darkGrayColor].CGColor;
}

我发现的是没有调用RoundedProfilePicture方法。在故事板中,我设置了一个原型单元格和正确的标识符。我还将图像视图设置为正确的Custom类。但它似乎没有生效,是否有我遗漏/可以检查的东西?

2 个答案:

答案 0 :(得分:0)

当您重复使用元素时,您应该覆盖UITableViewCell方法:

 -(void)prepareForReuse

而不是init。每次都会打电话。

如果你想要一次初始化,你应该在:initWithStyle:reuseIdentifier:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        //do your stuff here
    }
   return self;
}

来自apple docs:

  

如果您为指定的标识符注册了一个类并且必须创建一个新的单元格,则此方法通过调用其initWithStyle:reuseIdentifier:方法来初始化该单元格。对于基于nib的单元格,此方法从提供的nib文件加载单元格对象。如果现有单元可用于重用,则此方法将调用单元的prepareForReuse方法。

答案 1 :(得分:0)

问题是当UIimageView被子类化并从故事板调用时,会为init调用一个不同的方法。

-(id)initWithCoder:(NSCoder *)aDecoder {
    // As the subclassed UIImageView class is called from storyboard the initWithCoder is overwritten instead of init
    NSLog(@"%s",__PRETTY_FUNCTION__);
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setupView];
    }
    return self;
}

这解决了未调用圆形轮廓视图的问题。