使用2个UICollectionView实例但单元格未显示在其中一个实例中

时间:2014-04-18 14:28:32

标签: ios objective-c cocoa-touch uicollectionview uicollectionviewlayout

目标:

设置两个具有不同样式的collectionView。一种网格样式和其他单一文件样式。这些collectionViews可以切换,让用户可以查看他们喜欢的样式(网格/单个文件)的待售商品。

我有一个现有的collectionView,在界面构建器中设置了一个自定义单元格,它运行正常。我试图找到有关如何通过界面构建​​器添加第二个的信息,但没有找到任何运气。

我做了什么: 我在viewDidLoad方法中以编程方式创建了第二个collectionView。我有一个名为_collectionView2的实例变量。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    _collectionView2 = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
    [_collectionView2 setDataSource:self];
    [_collectionView2 setDelegate:self];

    [_collectionView2 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
    [_collectionView2 setBackgroundColor:[UIColor redColor]];

    [self.view addSubview:_collectionView2];
    [_collectionView2 setHidden:YES];

我修改了委托和数据源方法,让他们了解新的collectionView:

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    if (collectionView == _collectionView) {
      NSArray *people = [_thisController objects];
      return [people count];
    } else {

        return 20;
    }
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{      
    if (collectionView == _collectionView) {
         static NSString *CellIdentifier = @"Cell";
        VAGGarmentCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier: CellIdentifier forIndexPath:indexPath];

        [[cell activityIndicator] startAnimating];

        PFFile *userImageFile = [object valueForKey:@"image"];
        [[cell imageView] setFile: userImageFile];
        [[cell imageView] loadInBackground];

        [[cell activityIndicator] stopAnimating];

        [[cell title] setText:[object valueForKey:@"title"]];
        [[cell price] setText:[NSString stringWithFormat: @"£%@ GBP", [object valueForKey:@"price"]]];
        return cell;
    } else  {
         static NSString *CellIdentifier = @"Cell";

        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

        cell.backgroundColor = [UIColor greenColor];

        return cell;
    }

    //_addToFavouritesButton = [cell addFavouriteButton];

    [_addToFavouritesButton addTarget:_thisController action:@selector(addToFavouritesButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

 }

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if (collectionView == _collectionView2) {

      return CGSizeMake(50, 50);

    } else {
        return CGSizeMake(140, 272);
    }
}

然后我有一个方法响应UISegmentControl从网格样式显示切换到单个文件显示:

- (void)displayTypeSegmentSelected
{
    _selectedDisplayTypeIndex = [_displayTypeControl selectedSegmentIndex];

    if (_selectedDisplayTypeIndex == 0) {
        NSLog(@"Single file item view selected");

        [_collectionView setHidden:YES];

        [_collectionView2 setHidden:NO];
    } else {
        NSLog(@"Grid style view selected");
        [_collectionView setHidden:NO];
        [_collectionView2 setHidden:YES];
    }
}

最初隐藏CollectionView2,然后在使用段控件时取消隐藏。看起来它正在工作,因为当我切换红色背景显示时,我在创建collectionView时设置了红色背景,但绿色单元格根本没有显示。

我似乎无法看到我出错的地方。我想让它工作,所以我可以用我的自定义单元格替换单元格。网格显示和单个文件显示之间的唯一区别是单个文件显示将是占据视图宽度的放大单元格。所有属性等都是完全相同的意思,我可以使用我当前的自定义单元格。

为什么我的细胞不显示?我已经按照编程方式创建了一个关于collectionView的明确教程,但仍然没有显示单元格。

更新

我在if语句中放了一条日志消息,用于检查存在什么collectionView,它只触发我的_collectionView而不是_collectionView2。

非常感谢帮助。

此致

2 个答案:

答案 0 :(得分:0)

不确定这会解决您的问题,但是当我在一个控制器中有2个集合视图时,我使用它们的标签来确定我在给定函数中处理哪个,例如cellForItemAtIndexPath。

我也总是为两个单元格使用不同的单元格标识符,通常是uicollectionviewcell的不同子类。

您在哪里创建第一个集合视图并设置其委托?

答案 1 :(得分:0)

在我的UISegmentedControl触发的方法中重新加载表数据会使单元格显示出来。