Swift: UICollectionView en sélectionnant les problèmes d'indexPath de cellule
Je suis en train de faire un Collection View
par lequel quelqu'un choisit un cell
et pour chaque sélection, il les prend à un autre View Controller
qui contient le contenu de la sélection. Cependant, j'ai un mal de difficultés car une fois que j'applique cette ligne de code pour didSelectItemAtIndexPath
;
self.performSegueWithIdentifer("showDetail", sender: self)
et puis l'exécuter dans le Simulateur de la cell
de sélection est de travailler selon les indexPath
mais son souvenir les sélections chaque fois que je sélectionne de nouveaux cell
. Ainsi, par exemple, chaque cell
a une photo et de l'étiquette et si je sélectionne la première cell
dans le indexPath
la segue
me prend d'abord à la vue vierge et puis à mon sélectionné cell
. Si je choisis un autre cell
numéro 3 sur la indexPath
la vue vierge est aujourd'hui le premier cell
de mon précédent choix après qu'il faut pour mon troisième cell
. Son faire ça à chaque fois. Si je supprime le performSegueWithIdentifer
code (à partir de Xcode 6.2 (6.1.1 c'était aléatoire)) la sélection est mon choix précédent et jamais mon selectedCell', mais au moins sa sélectionner seulement une fois au lieu de deux fois pour accéder à un view
. Il se passe quelque chose de mal sur le indexPath
. C'est le code de mon prepareForSegue
override func prepareForSegue(segue: UIStoryBoardSegue, sender: AnyObject?) {
if segue.identifer == "showDetail" {
let detailVC:DetailViewController = segue.destinationViewController as DetailViewController
detailVC.selectedImageName = selectedImage
detailVC.selectedLabel = selectedLabels
}
}
Je suis coincé sur ce qu'il faut faire & quelle est la solution à appliquer. Dois-je garder performSegueWithIdentifer
code & créer un Equatable
à mettre en œuvre find(array, selection)
sur le indexPath
? Ou pourrais-je écrire une boucle, (ce qui semble beaucoup plus facile), qui irait à travers les indexPath
basée sur la sélection et à éliminer la cellule qui n'est plus sélectionnée. Cependant, je ne suis pas sûr de ce que la condition à écrire dans la boucle parce que je ne connais pas la valeur de la propriété de l 'selectedCell" parce que c'est facultatif.
for (index, value) in enumerate(cellItems) {
//something here to remove 'selectedItem' in the indexPath
}
Si je supprime performSegueWithIdentifer
code de didSelectItemAtIndexPath
ce que je peux faire dans mon prepareForSegue
pour obtenir la sélection sur la bonne indexPath?
MODIFIER le code complet à didSelectItemAtIndexPath
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
selectedImage = cellImages[indexPath.row] as String
selectedLabels = cellLabels[indexPath.row] as String
self.performSegueWithIdentifer("showDetail", sender: self)
}
J'ai essayé de changer l'expéditeur dans le performSegueWithIdentifer
à indexPath
mais le problème persiste.
EDIT 2 code Complet de mon CollectionViewController
class CollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
@IBOutlet weak var collectionView: UICollectionView!
var selectedImage = String()
var selectedLabels = String()
var cellImages:[String] = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg", "11.jpg", "13.jpg", "14jpg"]
var cellLabels:[String] = ["Photo 1", "Photo 2", "Photo 3", "Photo 4", "Photo 5", "Photo 6", "Photo 7", "Photo 8", "Photo 9", "Photo 10", "Photo 11", "Photo 12", "Photo 13", "Photo 14"]
func collectionView(collectionView: UICollectionView, numberOfNumberItemsInSection: Int) -> Int {
return cellImages.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell: PhotoViewCell = collectionView.dequeueReuseableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as PhotoViewCell
cell.labelCell.text = cellLabels[indexPath.row]
cell.ImageCell.image = UIImage(named: cellImages[indexPath.row])
return cell
}
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
selectedImage = cellImages[indexPath.row] as String
selectedLabels = cellLabels[indexPath.row] as String
self.performSegueWithIdentifer("showDetail", sender: self)
}
override func prepareForSegue(segue: UIStoryBoardSegue, sender: AnyObject?) {
if segue.identifer == "showDetail" {
let detailVC:DetailViewController = segue.destinationViewController as DetailViewController
detailVC.selectedImageName = selectedImage
detailVC.selectedLabel = selectedLabels
}
}
}
PhotoViewCell
class PhotoViewCell: UICollectionViewCell {
@IBOutlet var labelCell: UILabel!
@IBOutlet var ImageCell: UIImage!
}
MODIFIER 3 - Modifié
J'ai essayé ta suggestion et malheureusement le problème est toujours persistant sur le double point de vue - c'est toujours en passant par deux points de vue avant qu'elle m'emmène à la réelle sélectionné cell
. J'ai aussi modifié le code légèrement dans le didSelectItemAtIndexPath
mais il n'a toujours pas corrigé le problème.
if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? PhotoViewCell {
performSegueWithIdentifier("showDetail", sender: cell)
}
Cependant suite à votre suggestion de l'autre, dans mon StoryBoard
j'ai ajouté un segue
de mon Collection View
cell
à mon DetailViewController
qui a l'identifiant "showDetail". Si je supprime segue
rien ne peut être sélectionné à partir de mon cells
.
Il semble bien que la performSegueWithIdentifer
code est le déclencheur de la double vue, car lorsque je le supprime, le cell
n'est sélectionné qu'une seule fois, le problème était que la indexPath
de la cell
de sélection n'était pas correct, parce que c'est d'abord la sélection sur une vue vierge (est-ce à voir avec le showDetail segue
?), qui met ensuite mon indexPath
de la synchronisation.
MODIFIER Résolu
D'arrêter le double de sélections (la performSegueWithIdentifier
ligne a été supprimée): -
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
if let cell = collectionView.cellForItemAtIndexPath(indexPath) {
cellLabels[indexPath.row] as String
cellImages[indexPath.row] as String
}
}
Merci beaucoup pour votre aide !!!!
source d'informationauteur j03T
Vous devez vous connecter pour publier un commentaire.
(NOTE: j'ai mis à jour ce pour Swift 4 et plus pratiques modernes.)
Je m'en tiens à
UIView
objets autant que possible.Puis dans
prepare(for:sender:)
J'ai utilisé une extension que j'ai créé il y a un moment
findCollectionViewIndexPath()
Je soupçonne que vous avez un segue dans le storyboard déjà et n'ont pas besoin
func collectionView(, didSelectItemAtIndexPath:)
mais de toute façon, le préparer segue devrait fonctionner.Swift 3.0