如何每秒更新UICollectionViewCell的UILabel(快速)

时间:2016-07-19 07:14:12

标签: ios swift uicollectionview nstimer uicollectionviewcell

我有一个UICollectionViewCellUILabel显示两个日期之间的日差异。我想每秒更新一次。我已尝试使用NSTimer重新加载UICollectionview的数据,但它会使用户界面非常慢。

我如何实现这一目标? 感谢。

2 个答案:

答案 0 :(得分:1)

您不会仅仅为了更新标签而重新加载整个CollectionView甚至单个单元格。

您有两个选择:

  1. 在ViewController中编写NSTimer,只刷新可见单元格的内容。 每秒在ViewController中安排一个重复计时器。
  2. 触发计时器后,通过以下方法获取可见单元格,只获取显示时间的标签。

        let visibleIndexPaths = tableview.indexPathsForVisibleRows
    
        var visibleCellsArray: [UITableViewCell] = []
    
        for currentIndextPath in visibleIndexPaths! {
           //  You now have visible cells in visibleCellsArray
            visibleCellsArray.append(tableview.cellForRowAtIndexPath(currentIndextPath)!)
        }
    
    1. 在每个单元格中安排1秒重复计时器。触发计时器时,只需更新相应单元的标签即可。

答案 1 :(得分:0)

首先你设置为CollectionView hader并声明一个hader标签和标签设置为global,这样它很容易使用。

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {

    if (kind == UICollectionElementKindSectionHeader) {

        Like = indexPath;

        UICollectionReusableView *reusableview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath];

        if (reusableview==nil) {

            reusableview=[[UICollectionReusableView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
        }

        for (UILabel *lbl in reusableview.subviews)
        {
            if ([lbl isKindOfClass:[UILabel class]])
            {
                [lbl removeFromSuperview];
            }
        }

        label2=[[UILabel alloc] initWithFrame:CGRectMake(label.frame.size.width + 40, 0, 140, 50)];
        [reusableview removeFromSuperview];
        label2.text= [NSString stringWithFormat:@"END %@",[self testDateComaparFunc:[[DealArr valueForKey:@"end_time"] objectAtIndex:indexPath.section]]];

        label2.textColor = [UIColor whiteColor];
        [reusableview addSubview:label2];

        return reusableview;
    }

    return nil;
}

现在在viewWillAppear中设置计时器

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(runMethod) userInfo:nil repeats:YES];
}

将“定时器方法”设置为与“标签文本”中使用的相同

-(void)runMethod
{
    label2.text= [NSString stringWithFormat:@"END %@",[self testDateComaparFunc:[[DealArr valueForKey:@"end_time"] objectAtIndex:Like.section]]];
    NSLog(@"i'm calling");
}

我希望它对你有所帮助,因为它非常适合我,所以希望和你一样工作。