我不确定这是否是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类。但它似乎没有生效,是否有我遗漏/可以检查的东西?
答案 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;
}
这解决了未调用圆形轮廓视图的问题。