重新加载UICollectionView导致闪烁

时间:2013-10-01 19:08:32

标签: objective-c xcode uitableview uitabbarcontroller uicollectionview

我已经将一个CollectionView子类化并使用它来显示不同类别的图像集合。例如:最受欢迎,观看次数最多。我通过TabbarController访问每个类别/页面。

我所拥有的课程是:

主类 - MediaList - 基类,用于根据请求的媒体类型在集合视图中提取和显示媒体。

SubClasses - MostPopular和MostViewed都是从主类继承的非常轻的类。

问题是,当我从MostPopular移动到MostViewed时,集合视图最初显示最后一类图片然后刷新到新...结果你看到轻弹效果。

MediaList的示例代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.mediaCollection.dataSource = self;
    self.mediaCollection.delegate = self;
    [self getMedia];
}

(void) getMedia 
{
    NSLog(@"/////////////////////////   GETTING MEDIA  /////////////////////////");

    XMLGenerator * sharedXmlGen = [XMLGenerator sharedXmlGenerator];
    GlobalVars * sharedGlobalVars = [GlobalVars sharedGlobalVars];
    sharedXmlGen.assetFlag = _contentFilter;
    NSLog(@"The filter is: %@", _contentFilter);
    [sharedXmlGen getPhotoVideoWithCallBackFunction:^{
    [_mediaCollection performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}];
}

SubClass(MostPopular)的示例代码

- (void)viewDidLoad
{
    [super setContentFilter:FILTER_POPULAR];  //Set the filter for the type of content
    [super viewDidLoad];
// Do any additional setup after loading the view.
}

两个澄清:

  1. 我应该补充一点,我试图重新使用尽可能多的代码而无需在故事板或控制器上创建新视图。

  2. 由于返回的媒体非常动态且可以定期更新,因此我不得不在viewDidAppear上重新加载我的数据(使用getMedia)。现在这意味着在加载新视图时,每个特定页面的选择都会导致闪烁......

  3. 更新 - 经过进一步调查后,看起来这与子类化uicollectionview无关。相反,问题只是将数据重新加载到uicollectionview中。可以肯定的是,我只是点击了两个子视图中的一个。我还在viewdidAppear方法中添加了一个重载方法,只是为了看问题变得更糟。还可以更容易地看到问题是集合视图中的最后一组图像最初在新刷新之前显示最后一类图像。然后,一旦收集刷新,我就会闪烁。

    * 更新10月4日* 开始认为我最好的解决方案是显示一个等待指示器并在加载时阻止页面。我确实尝试将uicollectionview设置为nil,并且相信这也将解决问题,但不确定它是否会直接重置。

1 个答案:

答案 0 :(得分:3)

虽然在上面的代码中可能没有立即显现,但根本原因实际上是getMedia调用。所有的子类化等都可以完美地运行。

特别是在getMedia调用中使用重载方法并且正在创建问题。

[_mediaCollection performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];