iOS: Storyboard CollectionView segue pas être déclenchée
J'ai un UICollectionView contrôleur incorporé à l'intérieur d'une manette de navigation. Le collectionView listes de projets et chaque cellule est censé enchaîner à un ProjectDetail écran.
Je ne peut tout simplement pas obtenir la séquence de déclenchement. Si je déposez simplement un bouton sur la barre de navigation et le raccordement d'un segue dans le détail, il fonctionne. Mais le déclenchement de mon CollectionView cellule n'a pas.
Voici ce que le storyboard ressemble: http://cl.ly/RfcM j'ai un segue accroché à partir de la CollectionViewCell à la ProjectDetailViewController
Voici le code à l'intérieur de mon 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;
}
Je suppose que le problème est quelque part dans la façon dont je suis brancher les Cellules de la CollectionView.
Toute aide serait grandement appréciée!
OriginalL'auteur phil swenson | 2013-09-28
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas créer enchaîne directement à partir de cellules dans un storyboard parce que le collectionview est remplie de façon dynamique par le biais de la source de données. Vous devez utiliser le
collectionView:didSelectItemAtIndexPath:
et d'effectuer la séquence par programmation à l'aide deperformSegueWithIdentifier:expéditeur:
. Quelque chose comme ceci:où
MySegueIdentifier
est l'identifiant de la séquence définie dans la table de montage séquentiel.Storyboard
et il fonctionne.Cette réponse est obsolète. Certainement, vous pouvez créer enchaîne directement dans la table de montage séquentiel.
OriginalL'auteur Pulkit Goyal
TLDR: POUR UNE table de montage, ne pas appeler registerClass:forCellWithReuseIdentifier:. Il remplace ce que le storyboard de la cellule (y compris la façon dont enchaîne sont traitées):
Comment définir un UILabel dans UICollectionViewCell
Brève installation
de le définir comme une sous-classe de UICollectionViewController.
par programmation.
Générés UICollectionViewController code enregistré la cellule dans le viewDidLoad:
Première Question:
Le prepareForSegue:expéditeur: l'événement n'était pas de tir, ce qui m'a amené à cette réponse .
J'ai mis en place le UICollectionViewDelegate et collectionView:didSelectItemAtIndexPath: événement, qui s'appelait alors la séquence de la programmation.
Cela a réglé mon problème.
Deuxième Question: je suis passé à une cellule personnalisé contenant une étiquette. Après avoir accroché le tout, l'étiquette de la cellule n'a pas l'affichage.
Après quelques recherches, j'ai trouvé une solution contenue dans le lien en haut de ma réponse.
Troisième Problème et de la Solution: j'ai enlevé le registerClass:forCellWithReuseIdentifier: ligne. Quand j'ai couru mon application, l'étiquette est apparu correctement, mais quand j'ai puisé une cellule, elle a appelé l'prepareForSegue:expéditeur événement deux fois. En supprimant la registerClass:forCellWithReuseIdentifier ligne, la cellule de traitement des cellules touche directement, sans la nécessité de la méthode du délégué. C'est de cette façon que j'attendais le storyboard de travail. J'ai supprimé le collectionView:didSelectItemAtIndexPath: événement, qui a résolu le double-tir de prepareForSegue:expéditeur:. Si vous utilisez une table de montage, ne pas inscrire les classes de la cellule. Il remplace ce storyboard met en place.
OriginalL'auteur Luke
Avez-vous fait votre CollectionView de la Cellule de connexion dans
Triggered Segues
surselection
?Vous pouvez également déclencher une séquence par programmation à l'aide de
[self performSegueWithIdentifier:@"segueIdentifier" sender:nil]
dans
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
OriginalL'auteur mmackh
Équivalent code Swift pour la même question.
Assurez-vous que, dans le cas où si votre cellule a d'autres qui se chevauchent point de vue "Interaction de l'Utilisateur Activé" est décoché (vous pouvez trouver cette option, sous l'attribut de l'inspecteur de Vue/Interaction). Sinon, votre Robinet Geste est consommée par le recouvrement de la vue, didSelectItemAtIndexPath ne peut pas être appelé.
OriginalL'auteur brbabu