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

mp_

Membre confirmé
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
Bloc de code:
#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
Bloc de code:
#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
Bloc de code:
#import <Cocoa/Cocoa.h>
@class Fibonacci;

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

- (IBAction) calculateSuite:(id)sender;

@end
.m
Bloc de code:
#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* :
this class is not key value coding-compliant for the key suite.
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 !
 

tatouille

Vétéran
1 Juin 2004
5 174
494
Stanford CA
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

Bloc de code:
#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
 

mp_

Membre confirmé
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 ?
 

tatouille

Vétéran
1 Juin 2004
5 174
494
Stanford CA
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 ?
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
 

mp_

Membre confirmé
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
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 !
 

tatouille

Vétéran
1 Juin 2004
5 174
494
Stanford CA
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 !
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:
 

Céroce

Membre émérite
Le problème est réglé
Ce qui me soulève cette question : qu'est-ce que ce "File's Owner" ?
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.