(Réglé) Erreur récupération valeur d'un tableau ([__NSCFString objectAtIndex:]: unrecognized

Ben77650Ben77650 Membre
juillet 2014 modifié dans Apple Developer Programs #1

Bonjour à  tous,


 


J'ai encore aujourd'hui un souci pour récupérer la valeur de mon tableau (NSArray*)



NSArray* imgLink=_listePhotos;
NSLog(@Tab imgLink: %@", imgLink);

//renvoie Tab imgLink: 2014/04/18/i7e4m4286v.jpg

NSLog(@imgLink obj1: %@", [imgLink objectAtIndex:0]);

mon .h



@property(nonatomic,retain) NSArray* listePhotos;

Il me plante l'appli et me dit cela:


 


 



2014-04-18 16:09:14.563 Appli[4084:60b] -[__NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x10924f030


2014-04-18 16:09:14.565 Appli[4084:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x10924f030'


*** First throw call stack:


(


0   CoreFoundation                      0x0000000101d0e495 __exceptionPreprocess + 165


1   libobjc.A.dylib                     0x0000000101a6d99e objc_exception_throw + 43


2   CoreFoundation                      0x0000000101d9f65d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205


3   CoreFoundation                      0x0000000101cffd8d ___forwarding___ + 973


4   CoreFoundation                      0x0000000101cff938 _CF_forwarding_prep_0 + 120


5   Appli                                      0x000000010001acee -[ZoomPhoto viewDidLoad] + 158


6   UIKit                               0x000000010071059e -[UIViewController loadViewIfRequired] + 562


7   UIKit                               0x00000001007313cd -[UINavigationController _layoutViewController:] + 44


8   UIKit                               0x00000001007318dd -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 216


9   UIKit                               0x00000001007319dd -[UINavigationController _startTransition:fromViewController:toViewController:] + 83


10  UIKit                               0x0000000100732787 -[UINavigationController _startDeferredTransitionIfNeeded:] + 547


11  UIKit                               0x0000000100733238 -[UINavigationController __viewWillLayoutSubviews] + 43


12  UIKit                               0x000000010084d895 -[UILayoutContainerView layoutSubviews] + 202


13  UIKit                               0x000000010067a993 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 354


14  QuartzCore                          0x0000000104a30802 -[CALayer layoutSublayers] + 151


15  QuartzCore                          0x0000000104a25369 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 363


16  QuartzCore                          0x0000000104a251ea _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24


17  QuartzCore                          0x0000000104998fb8 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 252


18  QuartzCore                          0x000000010499a030 _ZN2CA11Transaction6commitEv + 394


19  UIKit                               0x0000000100619024 _UIApplicationHandleEventQueue + 10914


20  CoreFoundation                      0x0000000101c9dd21 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17


21  CoreFoundation                      0x0000000101c9d5f2 __CFRunLoopDoSources0 + 242


22  CoreFoundation                      0x0000000101cb946f __CFRunLoopRun + 767


23  CoreFoundation                      0x0000000101cb8d83 CFRunLoopRunSpecific + 467


24  GraphicsServices                    0x0000000103d3ff04 GSEventRunModal + 161


25  UIKit                               0x000000010061ae33 UIApplicationMain + 1010


26  Appli                               0x000000010001b763 main + 115


27  libdyld.dylib                       0x00000001023a65fd start + 1


)


libc++abi.dylib: terminating with uncaught exception of type NSException


(lldb) 


 



 


 


Merci d'avance à  ceux qui m'aideront


Réponses

  • LarmeLarme Membre
    avril 2014 modifié #2

    Le problème est que pour lui, imgLink est un NSString. Du coup, objectAtIndex: n'est pas une méthode de NSString.


    D'ailleurs, c'est ce qu'on remarque quand tu fais ton premier NSLog, cela n'as rien à  voir avec un NSArray.


  • Ben77650Ben77650 Membre
    avril 2014 modifié #3

    Et pourtant quand je met 



    NSString* imgLink=_listePhotos;

    Il me met ce warning


     



    Incompatible pointer types initializing 'NSString *' with an expression of type 'NSArray *'



  • ça veut juste dire que le compile pense savoir que _listePhotos est un NSArray (d'après les infos que tu lui as données).


    Mais le problème c'est que dans cette variable, tu as mis autre chose qu'un NSArray !!!


    Vas voir là  tu donne sa valeur à  _listePhotos.


  • Ben77650Ben77650 Membre
    avril 2014 modifié #5

    Je présume que tu parle de cela





    NSString* dossierPhoto = @http://www.fr.mywebsite.com/images/photos/;
        NSString* imgLink=[_Offredetail objectAtIndex:1];
        NSString* lienImg = [NSString stringWithFormat:@%@%@", dossierPhoto,imgLink];
        NSURL* urlImg = [NSURL URLWithString:[lienImg stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        if([lienImg isEqual:dossierPhoto])
        {
            _image1.image=[UIImage imageNamed:@no_photo.png];
        }
        else
        {
            _image1.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:urlImg]];
            NSLog(@urlImg: %@",urlImg);
    // renvoie urlImg: http://www.fr.mywebsite.com/images/photos/2014/04/18/i7e4m4286v.jpg

            [photos addObject:urlImg];
            NSLog(@photo: %@",photos);
    //renvoie photo: (    "http://www.fr.mywebsite.com/images/photos/2014/04/18/i7e4m4286v.jpg"
    )
            NSLog(@tab objet1: %@",[photos objectAtIndex:0]);
    // renvoie tab objet1: http://www.fr.mywebsite.com/images/photos/2014/04/18/i7e4m4286v.jpg
        }

  • Non, je ne vois pas de traces de _listePhotos


  • Ben77650Ben77650 Membre
    avril 2014 modifié #7

    Au temps pour moi c'est ici:



    -(void) onImageViewClicked{
        ZoomPhoto* zoom = [[ZoomPhoto alloc]init];
        zoom.listePhotos=[_Offredetail objectAtIndex:1];
        [self.navigationController pushViewController:zoom animated:NO];
        
    }

  • Et OffreDetails, c'est quoi exactement ? J'ai l'impression que c'est un NSArray de NSString. Du coup, c'est pas un NSArray de NSArray.



  • @property(nonatomic,retain) NSArray* Offredetail;


    OffreDetail: (
        "si\U00e8ge  auto is\U00e9os",
        "2014/04/18/i7e4m4286v.jpg",
        "18-04-2014",
        60,
        "Cadalen, France",
        "V\U00eatements accessoires b\U00e9b\U00e9s",
        81600,
        nath,
        "Si\U00e8ge auto de marque is\U00e9os en parfait \U00e9tat il est comme neuf et plus important, les b\U00e9b\U00e9s sont super bien install\U00e9."
    )
  • C'est donc un NSArray dans lequel tu as mis des NSString.

    Donc quand tu fais:
    zoom.listePhotos=[_Offredetail objectAtIndex:1];


    Tu lui as mis le premier NSString qu'il contenait.

    Donc pas de méthode objectAtIndex: pour lui.

     


  • Ben77650Ben77650 Membre
    avril 2014 modifié #11

    Dans ce cas pourquoi il me met ça alors ?  :/


     




    Et pourtant quand je met 



    NSString* imgLink=_listePhotos;

    Il me met ce warning


    Incompatible pointer types initializing 'NSString *' with an expression of type 'NSArray *'

     



  • colas_colas_ Membre
    avril 2014 modifié #12

    Car tu lui dis : mets un NSArray* dans un NSString*


    Car le compilo sait que _listePhotos est un NSArray*, c'est toi qui le lui a dit.


     


    Mais ailleurs dans ton programme, tu donnes une mauvaise valeur à  _listePhotos.


    C'est là  que le compilo devrait râler et dire ! "Non mais tu essaies de mettre un NSString* dans un NSArray*"


     


    Il ne râle pas car tu mets un (id) dans _listePhotos, donc le compilo n'a pas moyen de vérifier les types, il te fait confiance pour ne pas faire n'importe quoi.


     


    Pourquoi c'est un (id) ? Car c'est le résultat de objectAtIndex:0... C'est un donc un "objet en général", c'est un (id), on ne connaà®t pas son type.


     


    Si tu veux vraiment exécuter ta ligne, il faut faire



    NSString* imgLink=(NSString*)_listePhotos;

    EDIT :


     


    C'est un peu comme si tu appelais ton fils "Télévision" et que tu t'étonnes qu'il ne s'allume pas quand tu appuies sur la télécommande.


  • Ben77650Ben77650 Membre
    avril 2014 modifié #13

    Merci ça marche bien


     


    En tout cas merci à  vous 2 pour votre aide


  • MalaMala Membre, Modérateur


    Une idée de la bonne manière de faire svp ?




    Commencer par le début en potassant un bouquin de Cocoa pour apprendre et maà®triser les concepts de base? ;)

  • MalaMala Membre, Modérateur
    avril 2014 modifié #15


    Je fais de l'Objective-C depuis 1 an et demi (même si je ne le maitrise vraiment que depuis 6 mois).



    Et tu ne maà®trises pas le simple fait de manipuler des données dans un NSArray?  ???


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