多次调用自定义 UITableViewCell initWithStyle
Posted
技术标签:
【中文标题】多次调用自定义 UITableViewCell initWithStyle【英文标题】:Custom UITableViewCell initWithStyle called multiple times 【发布时间】:2014-08-16 05:17:32 【问题描述】:由于某种原因,我的自定义单元格在使用 tableView cellForRowAtIndexPath 方法时被多次初始化。在我的自定义单元格中,我有一个自定义视图来使用 AVPlayer 播放 AvItem。我的 tableView cellForRowAtIndexPath 方法看起来像这样
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell==nil)
[tableView registerClass:[MyCustomCell class] forCellReuseIdentifier:@"cell"];
cell = [[MyCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
MyCoreDataVideos *videos = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSURL * videoLocalURL = [[MyModel sharedInstance]localVideoDestinationFromVideoPath:videos.videoPath];
AVPlayerItem *item = [AVPlayerItem playerItemWithURL:videoLocalURL];
[cell.videoView.player setItem:item];
[cell.videoView.player play];
return cell;
而我的自定义单元格的 initWithStyle 方法如下所示
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
NSLog(@"I'm being called a lot of times ");
_videoView = [[MyVideoPlayerView alloc]init];
_videoView.frame = self.contentView.bounds;
[self.videoView.player setShouldLoop:YES];
[self.videoView setTapActionsEnabled:YES];
self.contentView.clipsToBounds = YES;
[self.contentView addSubview:_videoView];
[self layoutSubviews];
return self;
单元被多次初始化是否正常?我假设它会导致一些内存泄漏。
【问题讨论】:
我认为这不是问题,但您应该只向 tableView 注册一次单元格/类。viewDidLoad
通常是个好地方。
【参考方案1】:
两者
cell = [[MyCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
和
cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
正在做同样的事情!
删除第一个并让UITableView
进行单元格重用。它会为你调用 init。
此外,在 ios 6 及更高版本中,如果您提前注册了类/nib,则有一个 dequeueReusableCellWithReuseIdentifier:indexPath: 方法将始终返回一个单元格。不错!
【讨论】:
感谢您的回答,但它仍在多次初始化。 可以肯定的是,您的意思是屏幕上每个单元格不止一次,而不只是不止一次,对吗?此外,如果您将上面的代码更新为仅使用dequeueReusableCellWithIdentifier:
并删除对 initWithStyle:
的无关调用,这可能有助于其他人缩小问题范围以上是关于多次调用自定义 UITableViewCell initWithStyle的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UITableViewCell 不调用 prepareForSegue
调用 reloadData 时自定义 UITableViewCell 内存泄漏
未从自定义 uitableviewcell 调用 prepareForSegue