iOS:Storyboard CollectionView未被触发

时间:2013-09-28 19:20:06

标签: ios uicollectionview uistoryboard

我在导航控制器中嵌入了一个UICollectionView控制器。 collectionView列出项目,每个单元格应该转到ProjectDetail屏幕。

我根本无法触发segue。如果我只是在导航栏上放下一个按钮并将一个segue连接到细节,它就可以工作。但是从我的CollectionView单元格触发不会。

这是故事板的样子:http://cl.ly/RfcM我有一个从CollectionViewCell连接到ProjectDetailViewController的segue

这是我的ProjectDetailViewController中的相关代码:

@interface ProjectCollectionViewController () {
    NSArray *feedPhotos;
    Projects *projects;
}

@end

@implementation ProjectCollectionViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.collectionView registerClass:[FeedViewCell class] forCellWithReuseIdentifier:@"cell"];
    [self loadData];

}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"selected %d", indexPath.row);
    Project *project = [projects getProject:indexPath.row];
    NSLog(@"project = %@", project);
}

- (void)loadData {

    [self.projectLoader loadFeed:self.username
                       onSuccess:^(Projects *loadedProjects) {
                           NSLog(@"view did load on success :  projects %@", loadedProjects);
                           projects = loadedProjects;

                           [self.collectionView reloadData];
                       }
                       onFailure:^(NSError *error) {
                           [self handleConnectionError:error];
                       }];
}


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
   return projects.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"cell";
    FeedViewCell *cell = (FeedViewCell *) [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    cell.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0];
    UIImageView *cellImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    Project *project = [projects getProject:indexPath.row];
    NSString *imageUrl = [project coverPhotoUrl:200 forHeight:200];
    NSLog(@"imageurl =>%@", imageUrl);
    if (imageUrl) {
        [cellImageView setImageWithURL:[NSURL URLWithString:imageUrl]];
    }
    [cell addSubview:cellImageView];
    cell.imageView = cellImageView;
    return cell;
}

我猜这个问题在于我如何将Cell连接到CollectionView。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:21)

您无法直接从故事板中的单元格创建segues,因为集合视图是通过数据源动态填充的。您应该使用collectionView:didSelectItemAtIndexPath:并使用performSegueWithIdentifier:sender:以编程方式执行segue。像这样:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    [self performSegueWithIdentifier:@"MySegueIdentifier" sender:self];
}

其中MySegueIdentifier是故事板中定义的segue的标识符。

答案 1 :(得分:3)

TLDR:FOR STORYBOARD,不要调用registerClass:forCellWithReuseIdentifier:。它会覆盖故事板为单元格设置的内容(包括如何处理segue): How to set a UILabel in UICollectionViewCell

简要设置

  • 使用故事板
  • 使用Xcode模板创建了一个新的集合视图控制器, 将其设置为UICollectionViewController的子类。
  • 最初使用默认的UICollectionViewCell,添加UILabel 编程。

生成的UICollectionViewController代码在viewDidLoad中注册了单元格:

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];

第一期: prepareForSegue:sender:event没有触发,这让我得到了这个答案。 我实现了UICollectionViewDelegate和collectionView:didSelectItemAtIndexPath:事件,然后以编程方式调用segue。 这解决了我的第一个问题。

第二期:我切换到包含一个标签的自定义单元格。挂钩后,细胞标签没有显示。 经过一番挖掘后,我在答案的顶部找到了一个包含在链接中的解决方案。

第三个问题和解决方案:我删除了registerClass:forCellWithReuseIdentifier:line。当我运行我的应用程序时,标签显示正确,但是当我点击一个单元格时,它会调用prepareForSegue:sender事件两次。通过删除registerClass:forCellWithReuseIdentifier行,该单元直接处理单元格触摸,而无需委托方法。这就是我期望故事板工作的方式。我删除了collectionView:didSelectItemAtIndexPath:event,它解决了prepareForSegue:sender:的双重触发问题。 如果您使用的是故事板,请不要注册单元类。它会覆盖故事板设置的内容。

答案 2 :(得分:2)

您是否在Triggered Segues的{​​{1}}内建立了集合查看单元格的连接?

您还可以使用selection

以编程方式触发segue

[self performSegueWithIdentifier:@"segueIdentifier" sender:nil]

答案 3 :(得分:0)

类似问题的等效Swift代码。

Hello

如果您的单元格有其他重叠视图,请确保“启用用户交互取消选中(您可以在属性检查器View / Interaction下找到此选项)。否则,重叠视图会消耗您的Tap手势,可能不会调用 didSelectItemAtIndexPath