Ce forum est en partie financé par l’affichage de publicités. Merci de désactiver votre bloqueur de publicités pour nous permettre de continuer à fournir ce service.

NSArrayController : this class is not key value coding-c....

Discussion dans 'Développement Mac' créé par mp_, 21 Février 2009.

  1. mp_

    mp_ Membre confirmé

    Inscrit:
    8 Mars 2006
    Messages:
    166
    J'aime reçus:
    36
    Bonsoir,

    Je suis en pleine lecture du livre de Hillegass, "Programmation Cocoa pour MacOS X", troisième édition. J'en suis rendu au chapitre 8 qui traite du NSArrayController. Histoire de m'entraîner un peu, je développe ma propre petite application qui a, comme but, de calculer les n premières valeurs de la suite de Fibonacci (n défini par l'utilisateur via un NSTextField).

    Je développe une classe Fibonacci dont voici le code :
    .h
    Code (Text):

    #import <Foundation/Foundation.h>


    @interface Fibonacci : NSObject {
        int indice;
        int valeur;
    }
    @property(readwrite, assign) int indice;
    @property(readwrite, assign) int valeur;
    - (id)initWithIndex:(int)index;

    @end
     
    .m
    Code (Text):

    #import "Fibonacci.h"


    @implementation Fibonacci
    @synthesize indice;
    @synthesize valeur;

    - (id)init
    {
        [self dealloc];
        @throw [NSException exceptionWithName:@"BNRBadInitCall" reason:@"Bad initalizer called" userInfo:nil];
        return nil;
    }

    - (id)initWithIndex:(int)index
    {
        [super init];
        [self setIndice:index];
        int prev = 1, ante = 1;
        if (index < 2) valeur = 1;
        else {
            int i;
            int tmp;
            for (i = 2 ; i <= index ; i++) {
                tmp = ante + prev;
                ante = prev;
                prev = tmp;
            }
            valeur = tmp;
        }
        return self;
    }

    - (NSString *)description
    {
        NSString *ret = [[NSString alloc] initWithFormat:@"Indice %d = %d", [self indice], [self valeur]];
        return ret;
    }

    @end
     
    Cette classe fonctionne nickel en ligne de commande, par exemple.

    Pour mon programme, le but est donc de remplir un NSTableView avec le contenu d'un NSMutableArray contenant donc des objets Fibonacci.

    J'ai créé une classe AppController, que voici :

    .h
    Code (Text):

    #import <Cocoa/Cocoa.h>
    @class Fibonacci;

    @interface FibonacciController : NSObject {
        IBOutlet NSTextField *fibonacciInput;
        IBOutlet NSTableView *sortie;
        NSMutableArray *suite;
    }

    - (IBAction) calculateSuite:(id)sender;

    @end
     
    .m
    Code (Text):

    #import "FibonacciController.h"
    #import "Fibonacci.h"


    @implementation FibonacciController

    - (id)init
    {
        [super init];
        suite = [[NSMutableArray alloc] init];
        return self;
    }

    - (IBAction)calculateSuite:(id)sender
    {
        int indice = [fibonacciInput intValue];
        int i;
        for (i = 0 ; i < indice ; i++) {
            Fibonacci *thisFibonacci = [[Fibonacci alloc] initWithIndex:i];
            [suite addObject:thisFibonacci];
            NSLog(@"%@", thisFibonacci);
        }
        // Test
        NSLog(@"%@ : %@", [suite valueForKeyPath:@"indice"], [suite valueForKeyPath:@"valeur"]);
        [sortie reloadData];
    }

    @end
     
    Vient ensuite IB. Je créé une instance de ma classe AppController, créé mes liaisons entre cette instances, le NSTextField et le NSButton qui lance la méthode -calculateSuite: . Test, tout marche nickel.

    Là où ça se gâte, c'est pour afficher mon NSMutableArray suite dans le NSTableView. Je créé dans IB un object NSArrayController. Je bind le Content Array sur le model key path "suite" de File's Owner, comme décrit dans le livre ; puis je bind la première colonne du NSTableView à l'arrayController pour la valeur "indice", et la seconde colonne pour la valeur "valeur". Et là, au lancement du programme, *crac* :
    Pourquoi j'ai cette erreur ? Je m'y prends mal ? Dois-je stopper toute tentative de développer en utilisant Cocoa et me remettre au QBasic sous DOS ?:D

    Merci pour votre aide !
     
  2. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    donne ton projet, ou est definie outlet "suite"?
    l'a voie pas, ni le controller, tu merdes peu mais tu merdes t'es pas loin pas besoin
    de vouloir tout quitter

    @property(readwrite, assign) int indice;
    @property(readwrite, assign) int valeur;

    pas beau, coute beaucoup pour pas grand chose

    Code (Text):

    #include <stdio.h>
    #include <string.h>

    /*
    F0 F1 F2 F3 F4 F5 F6 F7 F8 F9
    0  1  1   2  3  5  8 13 21 34
    */
    unsigned long fib(int n) {
        return (1 == n || 2 == n) ? 1 : (fib(n-1) + fib(n-2));
    }

    int main (int argc, const char **argv) {
        int n;
        if (argc == 2) {
            n = atoi(argv[1]);
            fprintf(stdout, "f(%i) %u\n", n, fib(n));
        }
       
        return 0;
    }
     
    bien sur ne satisfait pas les indexes negatifs
     
  3. mp_

    mp_ Membre confirmé

    Inscrit:
    8 Mars 2006
    Messages:
    166
    J'aime reçus:
    36
  4. mp_

    mp_ Membre confirmé

    Inscrit:
    8 Mars 2006
    Messages:
    166
    J'aime reçus:
    36
    Le problème est réglé
    Voici le projet, si ça peut en aider certains : http://mp.proprenetworks.net/pFibonacci2-2.zip

    Les erreurs : déjà oui, il manquait un contrôleur pour "suite", mais ce n'était pas ce qui provoquait le plantage. C'était un mauvais binding (j'avais "bindé" mon Array Controller sur File's Owner pour le KP "suite", comme c'était indiqué dans le livre, alors qu'il fallait le binder sur Fibonacci Controller).

    Ce qui me soulève cette question : qu'est-ce que ce "File's Owner" ? Pourquoi le Array Controller est bindé sur File's Owner dans le livre ?
     
  5. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    File's Owner parce que ta classe devrait etre le delegate de file,s owner, tu as rate ca
    mais suite devrait etre un outlet
     
  6. mp_

    mp_ Membre confirmé

    Inscrit:
    8 Mars 2006
    Messages:
    166
    J'aime reçus:
    36
    Mmmmh, d'accord. Je pense que ce sont des mécanismes que j'acquerrais au fil du temps. En tous cas, j'avais un peu de mal avec le NSArrayController, mon petit programme m'a plutôt éclaircit les choses. Merci de ton aide !
     
  7. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    oui si tu en es la tu devrais aussit faire un tour du coter de NSProxy, et les key-value observers,

    tu devrais essayer de reproduire un simple arrayController avec ce materiel

    je pense que sont des points qui te manquent et sont en amont de ce que tu fais,
    ce sont des parties conceptuals/notions des MVC,

    http://borkware.com/rants/agentm/ (Marc Stephenson)

    et en general les quickies de borkware qui sont tres bien fait

    :zen:
     
  8. Céroce

    Céroce Membre émérite

    Inscrit:
    6 Octobre 2004
    Messages:
    949
    J'aime reçus:
    32
    File's Owner = Propriétaire du fichier :)D)

    Il s'agit de l'objet qui est à l'origine de la lecture du fichier .nib/.xib.
    C'est à dire que pour MainMenu.nib, il s'agit de l'application courante, pour MyDocument.nib du NSDocumentController, pour les .nib contenant une fenêtre, du NSWindowController respectif, etc.
     
Chargement...

iOccasion - Achetez un produit Apple d'occasion

refurb Apple