我有一个使用 XIB 文件创建的自定义 UICollectionViewCell。如何让这个单元格在点击时将另一个控制器推入堆栈

Posted

技术标签:

【中文标题】我有一个使用 XIB 文件创建的自定义 UICollectionViewCell。如何让这个单元格在点击时将另一个控制器推入堆栈【英文标题】:I have a custom UICollectionViewCell that was created using an XIB file.How do I get this cell to push another controller onto the stack when tapped 【发布时间】:2014-07-03 23:22:14 【问题描述】:

我无法在界面生成器中拖动和创建转场,因为这是一个 XIB 文件。基本上我有一个 UICollectionView 有两个布局。标准布局使用一个自定义单元格,而其他布局使用另一个自定义单元格。

第一个自定义单元格很容易连接,因为它不是 XIB 文件,所以我只需将其拖动并连接到我想要在点击它时推送到的详细视图。但是,第二个自定义单元格是 XIB 单元格,无法以这种方式连接。

这是我的集合视图 cellForRowAtIndexPath 方法:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object


  //      NSLog(@"cellForItemAtIndexPath");

        static NSString *CellIdentifier = @"Cell";
        static NSString *CellIdentifier2 = @"Cell2";
        VAGGarmentCell *cell;

        if ([[_collectionView collectionViewLayout] isEqual: _flowLayout]) 
            cell = [_collectionView dequeueReusableCellWithReuseIdentifier: CellIdentifier forIndexPath:indexPath];
         else if ([[_collectionView collectionViewLayout] isEqual: _flowLayout2]) 
            cell = [_collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier2 forIndexPath:indexPath];
            //       // Detect tap of image View
           UITapGestureRecognizer *gestureRecogniser = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapGarmentCellTwoImage:)];
           [gestureRecogniser setNumberOfTapsRequired:1];
           [[cell imageView] addGestureRecognizer:gestureRecogniser];
           [[cell imageView] setUserInteractionEnabled: YES];
        

        [[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"]]];

        // if database favourites status is equal to one then set highlighted to (yes)
        UIButton *addFavouriteButton = [cell addFavouriteButton];



       BOOL objectFavourited = [object[@"favourite"] boolValue]; // I set this when add fav button is tapped
       [addFavouriteButton setSelected: objectFavourited];


       [addFavouriteButton addTarget:self action:@selector(addFavouriteButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

       return cell;


- (void)didTapGarmentCellTwoImage:(UITapGestureRecognizer *)sender

    [self performSegueWithIdentifier:@"garmentDetailSegue" sender:self];

这种方式给我一个错误:

[UITapGestureRecognizer _layoutAttributes]: unrecognized selector sent to instance 0xc7f3290'

这看起来很乱。有一个更好的方法吗?拖动和连接到另一个单元格要容易得多。

【问题讨论】:

【参考方案1】:

您是否尝试过使用 collectionView:didSelectItemAtIndexPath: 而不在您的单元格上添加 TapGesture。

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
if ([[_collectionView collectionViewLayout] isEqual: _flowLayout]) 
    //do  what you want with the other cell selection
 
else if ([[_collectionView collectionViewLayout] isEqual: _flowLayout2]) 
    [self performSegueWithIdentifier:@"garmentDetailSegue" sender:self];

【讨论】:

以上是关于我有一个使用 XIB 文件创建的自定义 UICollectionViewCell。如何让这个单元格在点击时将另一个控制器推入堆栈的主要内容,如果未能解决你的问题,请参考以下文章

CollectionViewCell 边距?

iOS:使用 xib 的自定义视图

由于 nil 子视图,无法使用 Xib 文件创建自定义视图

使用 Xib 创建的自定义视图在 Interface Builder 中不起作用

如何继承具有 .xib 文件的自定义视图

带有 XIB 的自定义 UITableViewCell