8

我在导航控制器中嵌入了一个 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;
}

我猜问题出在我如何将 Cells 连接到 CollectionView 的某个地方。

任何帮助将不胜感激!

4

4 回答 4

21

您不能直接从情节提要中的单元格创建 segue,因为 collectionview 是通过数据源动态填充的。您应该使用collectionView:didSelectItemAtIndexPath:并使用 以编程方式执行 segue performSegueWithIdentifier:sender:。像这样的东西:

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

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

于 2013-09-28T21:33:52.387 回答
3

TLDR:对于故事板,不要​​调用 registerClass:forCellWithReuseIdentifier:。它覆盖了情节提要为单元格设置的内容(包括如何处理转场): How to set a UILabel in UICollectionViewCell

简要设置

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

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

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

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

第二个问题: 我切换到包含一个标签的自定义单元格。将所有内容连接起来后,单元格标签未显示。经过一番挖掘,我在答案顶部的链接中找到了一个解决方案。

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

于 2015-01-15T15:18:59.370 回答
2

您是否已将您的 CollectionView Cell 连接到Triggered Segueson selection

您还可以使用以编程方式触发 segue [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

于 2013-09-28T21:29:20.163 回答
0

类似问题的等效 Swift 代码。

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier(@"TargetSegway", sender: self)
} 

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

于 2015-08-18T17:58:04.193 回答