[Résolu] Problème avec Tuto Bindings de la doc officielle

GrosquickGrosquick Membre
juin 2011 modifié dans API AppKit #1
Bonjour,

Je suis en train d'apprendre la programmation Cocoa. J'ai un petit soucis avec un tutorial que je tente de reproduire.

Voici le lien : http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CurrencyConverterBindings/01introduction/introduction.html

En fait le problème semble se situer au niveau de la méthode initialize de la classe modèle Converter.

+ (void)initialize {<br />&nbsp; &nbsp; [Converter setKeys:<br />&nbsp; &nbsp; &nbsp; &nbsp; [NSArray arrayWithObjects:@&quot;dollarsToConvert&quot;, @&quot;exchangeRate&quot;, nil]<br />&nbsp; &nbsp; &nbsp; &nbsp; triggerChangeNotificationsForDependentKey:@&quot;amountInOtherCurrency&quot;];<br />}


Xcode (4) me dit que la méthode setKeys:triggerChangeNotificationsForDependentKey: est obsolète et qu'il faut utiliser à  la place keyPathsForValuesAffectingValueForKey:, mais je ne vois pas comment remplacer un message à  2 paramètres par un autre à  1 seul paramètre...

Bref dans tous les cas j'ai un plantage à  l'exécution :

<br />2011-06-16 19:06:50.117 CurrencyConverter[17521:903] An uncaught exception was raised<br />2011-06-16 19:06:50.118 CurrencyConverter[17521:903] [&lt;Converter 0x100133c60&gt; valueForUndefinedKey:]: this class is not key value coding-compliant for the key amountInOtherCurrency.<br />2011-06-16 19:06:50.120 CurrencyConverter[17521:903] *** Terminating app due to uncaught exception &#039;NSUnknownKeyException&#039;, reason: &#039;[&lt;Converter 0x100133c60&gt; valueForUndefinedKey:]: this class is not key value coding-compliant for the key amountInOtherCurrency.&#039;<br />*** Call stack at first throw:<br />(<br />	0&nbsp;  CoreFoundation&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff8246f7b4 __exceptionPreprocess + 180<br />	1&nbsp;  libobjc.A.dylib&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  0x00007fff87d520f3 objc_exception_throw + 45<br />	2&nbsp;  CoreFoundation&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff824c7969 -[NSException raise] + 9<br />	3&nbsp;  Foundation&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff82b2fb96 -[NSObject(NSKeyValueCoding) valueForUndefinedKey:] + 245<br />	4&nbsp;  Foundation&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff82a5f488 -[NSObject(NSKeyValueCoding) valueForKey:] + 420<br />	5&nbsp;  Foundation&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff82a62dcc -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 226<br />	6&nbsp;  Foundation&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff82a62e62 -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 376<br />	7&nbsp;  AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff84348b17 -[NSBinder valueForBinding:resolveMarkersToPlaceholders:] + 171<br />	8&nbsp;  AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff843bd8fa -[NSValueBinder _adjustObject:mode:observedController:observedKeyPath:context:editableState:adjustState:] + 601<br />	9&nbsp;  AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff843bd60c -[NSValueBinder _observeValueForKeyPath:ofObject:context:] + 282<br />	10&nbsp; AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff84472741 -[NSTextValueBinder _observeValueForKeyPath:ofObject:context:] + 43<br />	11&nbsp; AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff8433b9d7 -[NSObject(NSKeyValueBindingCreation) bind:toObject:withKeyPath:options:] + 557<br />	12&nbsp; AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff843184e2 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1172<br />	13&nbsp; AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff84316829 loadNib + 226<br />	14&nbsp; AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff84315d36 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 248<br />	15&nbsp; AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff84315b6e +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 326<br />	16&nbsp; AppKit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x00007fff843130ef NSApplicationMain + 279<br />	17&nbsp; CurrencyConverter&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  0x00000001000014c2 main + 34<br />	18&nbsp; CurrencyConverter&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  0x0000000100001494 start + 52<br />)<br />terminate called after throwing an instance of &#039;NSException&#039;<br />


Je pense qu'il s'agit de la clé amountInOtherCurrency qui n'existe pas (j'ai néanmoins tout fait comme dans le tuto).

Auriez-vous une idée ?

Merci d'avance.

Réponses

  • devulderdevulder Membre
    08:43 modifié #2
    Hello,

    Commencer par un tutorial parlant des Bindings, c'est pas la voie la plus simple que tu as choisi  ::)

    Je te conseille de commencer par un tutorial beaucoup plus simple, gestion d'une fenêtre, affichage d'un bouton etc etc

  • GrosquickGrosquick Membre
    08:43 modifié #3
    Ah mais ce n'est pas mon 1er tuto je te rassure, j'ai déjà  fait tout ce que tu cites :)
  • laudemalaudema Membre
    08:43 modifié #4
    dans 1308244201:


    Xcode (4) me dit que la méthode setKeys:triggerChangeNotificationsForDependentKey: est obsolète et qu'il faut utiliser à  la place keyPathsForValuesAffectingValueForKey:, mais je ne vois pas comment remplacer un message à  2 paramètres par un autre à  1 seul paramètre...


    En mettant le nom de la clef dans le nom de la méthode: [tt]keyPathsForValuesAffectingValueForAmountInOtherCurrency:[/tt] ?
    Un exemple ici (descendre jusqu'au listing 2).
    Tout le charme des conventions ;)

  • GrosquickGrosquick Membre
    08:43 modifié #5
    Merci !

    Voici le code de la classe Converter qui fonctionne correctement (pour ceux que ça intéresse) :

    <br />#import &quot;Converter.h&quot;<br /><br /><br />@implementation Converter<br /><br />@synthesize sourceCurrencyAmount, rate;<br /><br />+ (NSSet *)keyPathsForValuesAffectingAmountInOtherCurrency<br />{<br />&nbsp; &nbsp; return [NSSet setWithObjects:@&quot;sourceCurrencyAmount&quot;, @&quot;rate&quot;, nil];<br />}<br /><br />- (float)amountInOtherCurrency<br />{<br />&nbsp; &nbsp; return self.sourceCurrencyAmount * self.rate;<br />}<br /><br />@end<br />
    
  • GrosquickGrosquick Membre
    juin 2011 modifié #6
    Par contre une chose me titille. Avec cette méthode, la valeur du dernier champ (qui est calculée à  partir des deux premiers) n'est pas mise à  jour dès que l'on modifie la valeur de l'un des deux premiers champs, il faut appuyer sur Entrée ou Tab. Y-a-t-il moyen de définir simplement cela (je ne vois rien dans le code qui définit par quelle action la valeur est mise à  jour) ?

    MAJ : J'ai trouvé il faut cocher Continuously Update Value dans la section Bindings Inspector (pour les deux premiers champs de texte) !
Connectez-vous ou Inscrivez-vous pour répondre.