passer de la data depuis une uitableview via multiple segue

2»

Réponses



  • Tu peux nous montrer le code où tu récupères l'objet de la liste ?




     


    Je récupère les objets comme ceci :


    La table



    #import "TimeLineViewController.h"
    #import "TimeLineCell.h"
    ...

    @interface TimeLineViewController () <TimeLineCellDelegate>

    @property (nonatomic) NSIndexPath *selectedCellIndexPath;
    @property (nonatomic) NSMutableArray *item;

    @end

    @implementation TimeLineViewController

    {

    }

    configuration de la cellule:



    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
    {
    TimeLineCell *cell = [tableView dequeueReusableCellWithIdentifier:@Cell forIndexPath:indexPath];
    cell.indexPath = indexPath;
    cell.delegate = self;
    ...
      return cell;

    La cellule associée


    .h



    #import <UIKit/UIKit.h>

    @class TimeLineCell;


    @protocol TimeLineCellDelegate <NSObject>

    - (void)didTapItemButtonInTableViewCell:(TimeLineCell *)cell;

    - (void)didTapUserButtonInTableViewCell:(TimeLineCell *)cell;

    - (void)didTapLikeButtonInTableViewCell:(TimeLineCell *)cell;

    @end


    @interface TimeLineCell : UITableViewCell

    @property (strong, nonatomic) NSIndexPath *indexPath;

    @property (weak, nonatomic) id<TimeLineCellDelegate> delegate;

    @end


    .m



    #import "TimeLineCell.h"

    @implementation TimeLineCell



    - (IBAction)didTapUserButton
    {
    if (self.delegate)
    {
    [self.delegate didTapUserButtonInTableViewCell:self];
    }
    }

    - (IBAction)didTapItemButton
    {
    if (self.delegate)
    {
    [self.delegate didTapItemButtonInTableViewCell:self];
    }
    }

    - (IBAction)didTapLikeButton
    {
    if (self.delegate)
    {
    [self.delegate didTapLikeButtonInTableViewCell:self];
    }
    }

    - (void)prepareForReuse
    {
    self.indexPath = nil;
    self.delegate = nil;
    }

    @end

  • Joanna CarterJoanna Carter Membre, Modérateur
    Tu n'as pas montré les méthodes de UITableViewDataSource.
  • J'utilise le SDK de Parse pour construire ma table qui est une "PFQueryTableViewController "


    la data prend sa source au moyen d'une requête (voir ci-dessous) il ne reste ensuite qu'à  configurer la cellule



    - (id)initWithCoder:(NSCoder *)aCoder
    {
    self = [super initWithCoder:aCoder];
    if (self) {

    self.parseClassName = @Activity;
    self.textKey = @name;

    self.pullToRefreshEnabled = YES;
    self.paginationEnabled = YES;
    self.objectsPerPage = 10;
    }
    return self;
    }


    - (PFQuery *)queryForTable
    {
    PFUser *currentUser = [PFUser currentUser];

    PFQuery *queryObjects = [PFQuery queryWithClassName:self.parseClassName];
    [queryObjects whereKey:@fromUser equalTo:currentUser];
    ...
    if ([self.objects count] == 0) {
    queryObjects.cachePolicy = kPFCachePolicyCacheThenNetwork;
    }else {
    }
    [queryObjects orderByDescending:@createdAt];

    return queryObjects;
    }

  • Joanna CarterJoanna Carter Membre, Modérateur

    Je répète : Tu n'as pas montré les méthodes de UITableViewDataSource


  • Joanna je ne suis pas sûr de ce que tu veux voir exactement,


    Ce n'est pas une UITableView classique, la class reference est ici :


    https://parseplatform.github.io/Parse-SDK-iOS-OSX/api/Classes/PFQueryTableViewController.html


     


    les méthodes de UITableViewDataSource doivent être celles ci-dessous,


    a priori je n'ai rien d'autre (?)



    @class PFObject;
    @interface TimeLineViewController : PFQueryTableViewController



    @interface TimeLineViewController () <TimeLineCellDelegate>

    @property (nonatomic) NSIndexPath *selectedCellIndexPath;
    @property (nonatomic) NSMutableArray *item;

    @end

    @implementation TimeLineViewController

    {

    }




    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
    {
    TimeLineCell *cell = [tableView dequeueReusableCellWithIdentifier:@Cell forIndexPath:indexPath];
    cell.indexPath = indexPath;
    cell.delegate = self;


    PFObject *retrieveobject = [object objectForKey:@toObject];



    PFFile *objectPicture = [retrieveobject objectForKey:@imageFile];
    PFImageView *Picture = (PFImageView*)[cell viewWithTag:100];
    Picture.file = objectPicture;
    Picture.image = [UIImage imageNamed:@placeholder.png];
    [Picture loadInBackground];

    ...etc

    return cell;
    }



    - (UITableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @LoadMoreCell;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    return cell;

    }
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentSize.height - scrollView.contentOffset.y < (self.view.bounds.size.height)) {
    if (![self isLoading]) {
    [self loadNextPage];
    }
    }
    }


  • Joanna CarterJoanna Carter Membre, Modérateur


    Bonjour,


    Je reviens sur ce topic au sujet des buttons intégrés sur une cellule.


    J'ai intégré sur mon uitableview un uibarbuttonitem, l'outlet est bien appelé et relié :



    @property (weak, nonatomic) IBOutlet UIBarButtonItem *addFriendsButton;

    ce bouton est lié vers un autre controller via storyboard segue (sur lequel je ne fais pas passer de data)


     


    Mon problème : lorsque la table est vide (uniquement) et lorsque j'appuie sur cet UIBarButtonItem l'appli plante avec le message d'erreur suivant :



    *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

    Lorsque sur la table apparait au moins 1 cellule, il n'y a plus de crash. Je pense que ce problème est lié au fait d'avoir intégré une cellule au moyen d'une autre class (avant de le faire je n'avais pas ce problème). Cependant je ne vois pas comment le résoudre... auriez-vous une idée ?




     


    Je viens de relire ce message.


     


    Tu dis que tu as "intégré" un UIBarButtonItem dans le UITableView...


     


    Pourquoi ? et comment ?



  • Je viens de relire ce message.


     


    Tu dis que tu as "intégré" un UIBarButtonItem dans le UITableView...


     


    Pourquoi ? et comment ?




     


    Sur mon storyboard j'ai juste placé un Bar Button Item (sur un Navigation item) que j'ai ensuite relié à  un navigation controller (lui-même relié à  un autre VC)


    Lorsque la table est vide aucun Bar button item ne fonctionne et j'ai le message d'erreur mentionné plus haut.


    Lorsque sur la table apparaà®t au moins une cellule (donc alimentée par de la data) les Bar button fonctionnent.


     


    Je vois sur stackoverflow que je ne suis pas le seul à  avoir rencontré ce genre d'erreur, par exemple ici


    http://stackoverflow.com/questions/23423473/nsrangeexception-reason-nsarraym-objectatindex-index-5-beyond-bou


     


    la solution se trouve certainement dans cette réponse "You array is empty, but you're trying to access an object in it. That is the problem " mais pour le moment avec mon propre code je n'arrive pas à  trouver de solution satisfaisante...

  • Joanna CarterJoanna Carter Membre, Modérateur


    Sur mon storyboard j'ai juste placé un Bar Button Item (sur un Navigation item) que j'ai ensuite relié à  un navigation controller (lui-même relié à  un autre VC)




     


    Bah, non !


     


    Avant de discuter le problème de l'index :


     


    Tu ne veux pas poser le UINavigationItem comme ça. D'abord, sans avoir mettre le tableViewController dans un UINavigationController, ce que tu as fait, c'est de le mettre dans le tableViewController, pas le tableView.


     


    Tu dois commencer avec un UINavigationController, avec ton viewController là  dedans. Puis, tu peux mettre le UIBarButtonItem dans le UINavigationBar qui est fourni.


     


    Après tu l'as fait, tu peux mettre un deuxième viewController sur le storyboard et, là , tu peux relier le bouton à  ce deuxième viewController.



  • Tu dois commencer avec un UINavigationController, avec ton viewController là  dedans. Puis, tu peux mettre le UIBarButtonItem dans le UINavigationBar qui est fourni.


     


    Après tu l'as fait, tu peux mettre un deuxième viewController sur le storyboard et, là , tu peux relier le bouton à  ce deuxième viewController.




    Oui sorry je me suis mal exprimé c'est exactement ce que j'ai fait, donc pour le moment ma construction semble correcte. Le UIBarButtonItem fonctionnait parfaitement avant que j'intègre la cellule "TimeLineCell". Il y a sans doute un problème avec l'index ...

Connectez-vous ou Inscrivez-vous pour répondre.