我在导航控制器中嵌入了一个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。
非常感谢任何帮助!
答案 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
简要设置
生成的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
在
[self performSegueWithIdentifier:@"segueIdentifier" sender:nil]
答案 3 :(得分:0)
类似问题的等效Swift代码。
Hello
如果您的单元格有其他重叠视图,请确保“启用用户交互”取消选中(您可以在属性检查器View / Interaction下找到此选项)。否则,重叠视图会消耗您的Tap手势,可能不会调用 didSelectItemAtIndexPath 。