7

NSStrings我有一个, one UILabel& a的数组UICollectionView

我的问题:

我希望数组的计数来确定有多少UICollectionViewCell

每个都UICollectionViewCell包含一个按钮。单击后,我希望此按钮使数组中与UICollectionViewCell的编号相对应的数据显示在标签中。

例如,如果用户点击 13thUICollectionViewCell的按钮,那么NSString数组中的第 13 个将成为UILabel的文本。

我做了什么:

UICollectionViewCell我为用于所有 s 的 nib 文件创建了自己的子类,UICollectionViewCell并将按钮作为 .h 文件连接到 .h 文件IBAction。我还导入了MainViewController.h,它包含存储NSStrings 的数组属性。

当我在UICollectionViewCell's 操作中编辑代码时,我无法访问数组属性。IBAction该按钮确实有效 - 我在' 方法中放置了一个 NSLog ,它确实有效。

我已经搜索了数十个关于 SO 的其他答案,但没有一个回答我的具体问题。如果需要,我可以用我的代码示例更新它。

4

3 回答 3

15

我为用于所有 UICollectionViewCells 的 nib 文件创建了自己的 UICollectionViewCell 子类,并将按钮作为 IBAction 连接到 .h 文件。

如果将 IBAction 连接到 collectionViewCell 的子类,则需要创建一个委托以使触摸事件在显示数据的 viewController 中可用。

一个简单的调整是将按钮添加到 collectionViewCell,将它的 IBOutlet 连接到单元格。但不是 IBAction。在cellForRowAtIndexPath: 包含collectionView的那个viewController中为按钮添加一个eventHandler。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    //Dequeue your cell

    [cell.button addTarget:self 
                    action:@selector(collectionViewCellButtonPressed:)
          forControlEvents:UIControlEventTouchUpInside];

    return cell;

}


- (IBAction)collectionViewCellButtonPressed:(UIButton *)button{

    //Acccess the cell
    UICollectionViewCell *cell = button.superView.superView;

    NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];

    NSString *title = self.strings[indexPath.row];

    self.someLabel.text = title;

}
于 2013-05-09T03:50:20.400 回答
1

请像这样尝试..

在 YourCollectionViewCell.h

为您添加到 xib 的 UIButton 创建一个名为 IBOutlet 而不是 IBAction 的按钮。请记住,您应该将插座连接到单元对象而不是 xib 中的文件所有者。

主视图控制器.m

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

  cell.button.tag = indexPath.row;
  [cell.button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
return cell;
} 

-(void)buttonPressed:(UIButton*)sender
{
  NSLog(@"%d : %@",sender.tag,[array objectAtIndex:sender.tag]);
  self.textLabel.text = [array objectAtIndex:sender.tag];
 }

编辑 - 处理多个部分

 -(void)buttonPressed:(UIButton*)sender
 {
  NSIndexPath  *indexPath = [self.collectionView indexPathForCell: (UICollectionViewCell *)sender.superview.superview];

NSLog(@"Section : %d  Row: %d",indexPath.section,indexPath.row);

if (0 == indexPath.section) {
    self.textLabel.text = [firstArray objectAtIndex:indexPath.row];
}
else if(1 == indexPath.section)
{
     self.textLabel.text = [secondArray objectAtIndex:indexPath.row];
}

}
于 2013-05-09T04:29:58.080 回答
0

当我在 UICollectionViewCell 的操作中编辑代码时,我无法访问数组属性。

那是因为您将按钮操作连接到“错误”对象。它需要连接到 MainViewController(或者任何有权访问数组属性的人)。

您将有几个任务要执行:

  • 接收按钮操作消息。

  • 访问数组(数据的模型)。

  • 抛出一个开关,说明现在应该显示哪个单元格的标签。

  • 告诉集合视图reloadData,从而刷新单元格。

所有这些任务应该最方便地属于一个对象。我假设这是 MainViewController(因此我假设 MainViewController 是集合视图的委托/数据源)。

于 2013-05-09T02:14:53.247 回答