多次调用自定义 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

UITableViewCell 中的 UIWebview

调用 reloadData 时自定义 UITableViewCell 内存泄漏

未从自定义 uitableviewcell 调用 prepareForSegue

添加附件时自定义 UITableViewCell 大小不正确

如何从自定义 UITableViewCell 调用操作以重新加载 tableView