CollectionView внутри TableViewCell - PullRequest
       29

CollectionView внутри TableViewCell

0 голосов
/ 11 декабря 2019

Я использовал CollectionView внутри TableViewCell. Все отлично работает и показывает все как положено. Но если я прокручивал TableView очень быстро, элементы (я использовал изображения в collectionView) из одной коллекции заменялись элементами (изображениями) из другой коллекции и переопределяли его при просмотре (в режиме отладки в коде все работает нормально, просто отображаетсяих).

UITableView GetCell ():

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        var item = _view.Items[indexPath.Row];
        var cell = (MyTableCell)tableView.DequeueReusableCell(“cell”);
        cell.TextLabelView.Text = item.Title;
        cell.YesButtonView.Hidden = item.IsCategory;
        cell.NoButtonView.Hidden = item.IsCategory;
        if (item.IsImagePoint)
        {
            cell.ImagesCollectionView.DataSource = new ItemsDataSource(item.Images, cell.ImagesCollectionView);
            cell.ImagesCollectionView.Delegate = new ItemsDelegate(item, _view);
        }
        return cell;
    }

UICollectionView GetCell ():

public override UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)
    {
            var cell = (ImageViewCell)_collectionView.DequeueReusableCell(new NSString(“ImageViewCell”), indexPath);
            var image = _images[indexPath.Row];
            var imagePath = image.ThumbnailPath;
            if (!string.IsNullOrEmpty(imagePath))
            {
                cell.ImagePath = imagePath;
            }
            return cell;
    }

Ответы [ 2 ]

2 голосов
/ 11 декабря 2019

Это, вероятно, из-за системы повторного использования ячеек в UITableView. Правильно ли настроены ваши данные при настройке ячейки? Вы звоните CollectionView reloadData()?

РЕДАКТИРОВАТЬ : Вы должны позвонить в tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell, где вы настраиваете свою ячейку. Таким образом, каждый раз, когда ячейка используется повторно, вы обновляете ее содержимое.

EDIT 2 : Как я уже сказал, попробуйте добавить представление коллекции reloadData() при настройке ячейки табличного представления. ,Вы также должны очистить свой источник данных и делегировать, потому что это повторно используемая ячейка, поэтому она, возможно, уже использовалась с другим значением.

 if (item.IsImagePoint)
    {
        cell.ImagesCollectionView.DataSource = new ItemsDataSource(item.Images, cell.ImagesCollectionView);
        cell.ImagesCollectionView.Delegate = new ItemsDelegate(item, _view);
    }
 else
    {
        cell.ImagesCollectionView.DataSource = null;
        cell.ImagesCollectionView.Delegate = null;
    }

 cell.ImagesCollectionView.ReloadData()

 return cell;
0 голосов
/ 03 января 2020

Swift 5 Добавьте это в свой класс UITableViewCell.

override func prepareForReuse() {

        collectionView.dataSource = nil
        collectionView.delegate = nil
        collectionView.reloadData()

        collectionView.dataSource = self
        collectionView.delegate = self
  }
...