Как обновлять UILabel UICollectionViewCell каждую секунду (быстро)

ios swift uicollectionview nstimer uicollectionviewcell

656 просмотра

2 ответа

199 Репутация автора

У меня есть UICollectionViewCellс UILabelразницей в днях между двумя датами. Я хочу обновлять его каждую секунду. Я попытался использовать NSTimerдля перезагрузки данных UICollectionview, но это делает интерфейс очень медленным.

Как мне добиться этого? Благодарю.

Автор: Khoury Источник Размещён: 19.07.2016 07:14

Ответы (2)


1 плюс

2041 Репутация автора

Вы не перезагружаете весь CollectionView или даже отдельные ячейки только для обновления метки.

У вас есть 2 варианта:

  1. Напишите NSTimer в ViewController и просто обновите содержимое видимых ячеек. Запланируйте повторяющийся таймер в ViewController на каждую секунду.

Когда таймер сработает, получите видимые ячейки следующим способом и получите только метку, отображающую время.

    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-секундный повторяющийся таймер в каждой ячейке. Когда таймер срабатывает, просто обновите метку соответствующей ячейки.
Автор: 7vikram7 Размещён: 19.07.2016 07:23

0 плюса

633 Репутация автора

Сначала вы устанавливаете в CollectionView hader и объявляете одну метку hader и метку глобальной, чтобы ее было легко использовать.

- (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");
}

Я надеюсь, что это поможет вам, потому что это работает на моей стороне очень хорошо, так что надеюсь, работает так же, как у вас.

Автор: Super Developers Размещён: 08.09.2017 05:32
Вопросы из категории :
32x32