7
votes

Utilisez un bouton sur un uicollectionviewcell pour afficher des données d'un tableau

J'ai un tableau de nstrings , un uilabel & a uicollectionview .

ma question:

Je veux que le nombre de tableau déterminer le nombre de uicollectionviewcell est.

Chaque uicollectionviewcell contient un bouton. En cliquant sur Click, je veux que ce bouton provoque les données de la matrice correspondant au numéro de code uicollectionviewcell à afficher dans l'étiquette.

Par exemple, si l'utilisateur clique sur la touche 13 / code> uicollectionviewcell , alors le 13ème nstring dans le tableau deviendrait le uilabel Le texte de celui-ci.

ce que j'ai fait:

J'ai fait ma propre sous-classe de uicollectionviewcell pour le fichier NIB que j'utilise pour tous les uicollectionviewcell s, et connecté le bouton au fichier .h. ibaction . J'ai également importé le mainviewcontroller.h , lequel est celui qui contient la propriété Array qui stocke le nstring s.

Lorsque je modifie le code dans l'action uicollectionviewcell , je ne peux pas accéder à la propriété Array. Le bouton fonctionne - j'ai placé un NSLog dans la méthode ibaction , qui fonctionne.

J'ai cherché des dizaines d'autres réponses à ce sujet, mais aucune ne répond à ma question spécifique. Je peux mettre à jour cela avec des échantillons de mon code si demandé.


3 commentaires

Tout suivi sur cette question?


Mon principal problème était que j'étais que la cellule que j'utilisais n'était pas une instance de ma sous-classe Uicollectionviewcell personnalisée. J'utilisais une instance régulière Uicollectionviewcell. Erreur de débutant. Merci pour toute l'aide!


@tagabek Peut-être que Anupdas devrait être accepté?


3 Réponses :


0
votes

Lorsque je modifie le code dans l'action Uicollectionviewcell, je ne peux pas accéder à la propriété Array.

C'est parce que vous avez connecté l'action de bouton au "mauvais" objet. Il doit être connecté au MainViewController (ou qui est que fait a accès à la propriété Array).

Vous allez avoir plusieurs tâches à effectuer:

  • Recevez le bouton Action du bouton.

  • Accédez au tableau (le modèle pour les données).

  • lancer un interrupteur indiquant quelle cellule doit maintenant avoir son étiquette montrant.

  • Indiquez la vue de la collection à ReloadData , ainsi rafraîchissant les cellules.

    Toutes ces tâches devraient appartenir mieux à un objet . Je suppose que c'est que c'est MainviewController (et je suppose donc que le MainViewController est le délégué / datasource de la vue de la collection).


2 commentaires

L'action du bouton ne peut pas se connecter au MainViewController car il est à l'intérieur de l'uicollectionviewcell. L'étiquette est en fait une partie du MainViewController.xib et non de l'uicollectionviewcell.nib (désolé, j'aurais dû spécifier). Disons que j'ai 50 uicollectionviewcells dans l'uicollectionview. Il y a 50 boutons dans toute la vue de la collection - une dans chaque cellule. Je veux connecter chaque index du tableau à chaque cellule. J'espère que cela aide à préciser. J'apprécie l'aide!


"L'action du bouton ne peut pas se connecter au MainViewController". Certes, ça peut. Peut-être que vous ne pouvez pas la définir en éliminant la connexion dans le storyboard, mais vous pouvez la définir dans le code (dans votre implémentation de CollectionView: CORELFORITEMATDEXPATH: serait un endroit très pratique et il y a maintenant maintenant Une autre réponse vous montrant comment faire cela - à ce tarif, vous n'aurez pas à faire aucun penser pour vous-même).



15
votes

J'ai fait ma propre sous-classe d'uicollectionviewcell pour le fichier NIB que j'utilise pour tous les uicollectionviewcells et connecté le bouton du fichier .h comme une ibaction.

Si vous connectez l'ibaction à la sous-classe de CollectionviewCell, vous devez créer un délégué pour rendre l'événement tactile disponible dans la zone ViewController où vous affichez les données.

Un Tweak facile est d'ajouter le bouton de CollectionViewCell, connectez-vous Iboutlet à la cellule. Mais pas ibaction. Dans le CellfrowrotindexPath: Ajouter un événementHandler pour le bouton dans cette vue ContourcLer contenant la collectionView. xxx


0 commentaires

1
votes

S'il vous plaît essayez comme ça ..

dans YourCollectionviewcell.h strong> p>

Créer une iboutlet non ibaction appelée appelé pour l'uibutton que vous avez ajouté à la XIB. N'oubliez pas que vous devez connecter la prise à l'objet de cellule non au propriétaire du fichier dans le XIB. p>

MainViewController.M strong> p> xxx pré>

Modifier plusieurs sections strong> p>

 -(void)buttonPressed:(UIButton*)sender
 {
  NSIndexPath  *indexPath = [self.collectionView indexPathForCell: (UICollectionViewCell *)sender.superview.superview];

NSLog(@"Section : %d  Row: %d",indexPath.section,indexPath.row);

if (0 == indexPath.section) {
    self.textLabel.text = [firstArray objectAtIndex:indexPath.row];
}
else if(1 == indexPath.section)
{
     self.textLabel.text = [secondArray objectAtIndex:indexPath.row];
}

}


5 commentaires

Comment allez-vous gérer lorsque la section devrait également être utilisée?


Pas possible de gérer plusieurs sections .. mais ici op stocke les détails dans un tableau et que les données appropriées correspondent au numéro de la cellule. Quel stagiaire signifie qu'il n'a qu'une seule section. S'il a plusieurs sections, il ne peut pas utiliser une matrice. J'ai vu votre réponse son plus générique. Mais je pense que mon code suffit


J'ai en fait 4 sections. Pouvez-vous expliquer pourquoi je ne peux pas utiliser un tableau?


Ensuite, comment identifierez-vous les données du tableau? Vous avez uniquement le numéro de cellule, c'est-à-dire indexpath.row .. Pour chaque section, son compte est comme SEC1: 0,1,2 .. Sec: 0,1,2 ... Alors comment pouvez-vous identifier les données de la matrice appartient à la section à l'aide de l'index de la matrice ?? Vous ne pouvez pas utiliser un seul tableau. Besoin de tableaux différents pour différentes sections. Il est donc préférable d'utiliser un dictionnaire dans votre cas


@tagabek, vous pouvez utiliser très bien le tableau. Vous avez besoin de format comme celui-ci. Vous devriez avoir une gamme de dictionnaires. Considérez chacun de ces dictionnaires comme vos sections. Chaque dictionnaire de section aurait un tableau ou des rangées. Afin qu'il soit facile à utiliser.