2011-11-16 2 views
0

J'ai créé une nouvelle application basée sur les documents.Impossible d'enregistrer dans une application basée sur un document

I mis en œuvre dataOfType dans la sous-classe de NSDocument

- (NSData*) dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError 
{ 
     return [NSKeyedArchiver archivedDataWithRootObject:bcmwc.bindingsController.arrangedObjects]; 
} 

in xib http://i.minus.com/iH2Rj9v5oOhTn.png

Lorsque je clique sur "Enregistrer" dans gonna rien de menu se produire, des erreurs dans la console. J'ai défini un point d'arrêt dans dataOfType et lorsque j'ai cliqué sur "Enregistrer", l'application ne s'est pas arrêtée.

Des suggestions?

EDIT

je pense qu'il peut être lié à fait, je l'utilise NSWindowController de coutume, et xib personnalisé. J'ai fait un test quand je charge xib personnalisé, tout est bien la méthode dataOfType est invoquée etc ..

Dois-je connecter d'une certaine manière mon xib personnalisé (fenêtre) avec la sous-classe de NSDocument?

+2

"Lorsque je clique sur" Enregistrer "dans le menu, il ne se passera rien, aucune erreur dans la console." S'il vous plaît expliquer cela mieux. –

+0

Veuillez également prendre soin de choisir des noms de sujet plus précis. "First Document-Based Application" nous dit exactement rien sur la nature de votre question. –

Répondre

0

Il semble que votre élément de menu Enregistrer est correctement connecté, alors concentrons-nous sur le code (+1 pour l'avoir posté en premier lieu).

Vous ne faites rien dans votre code pour vous assurer que -archivedDataWithRootObject: renvoie des données valides ou définissez une erreur si ce n'est pas le cas. Ma meilleure supposition (parce que vous n'avez pas fourni assez de détails pour faire autre chose que de deviner) est que vous retournez à zéro parce que votre appel à -archivedDataWithRootObject: fait la même chose. Vérifiez si vous obtenez des données valides et définissez l'erreur outError si ce n'est pas le cas.

Pourquoi auriez-vous un montant nul? Il se peut qu'un ou plusieurs des objets du graphique d'objets créés en archivant le tableau -arrangedObjects de votre contrôleur de matrice ne soient pas conformes à <NSCoding>. C'est probablement le cas si votre contrôleur RAID contient des objets d'une classe personnalisée que vous avez créée plutôt qu'un conteneur de liste de propriétés standard.

lire les archives et sérialisations Guide de programmation (en particulier, la section Encoding and Decoding Objects) pour apprendre comment rendre votre conformité classe personnalisée <NSCoding> pour qu'il sache comment se sérialisation (lui-même écrire dans un flux d'octets approprié pour NSKeyedArchiver, etc. et créer une instance de lui-même à partir d'un tel flux d'octets).

De plus, vous avez vraiment besoin d'apprendre à utiliser le débogueur. Vous êtes à tâtons dans une grotte sombre avec beaucoup d'embûches et pas de lampe de poche sans cela. Essayez de définir un point d'arrêt dans les méthodes que vous souhaitez appeler. Si elles ne sont pas appelées, vous pouvez vérifier les points de vente/actions, etc. Si tel est le cas, vous pouvez parcourir chaque ligne et vous assurer que tout fonctionne comme prévu. Si vous écrivez un code un peu plus détaillé, vous pouvez plus facilement inspecter les résultats lorsqu'ils sont en pause dans le débogueur. Deux lignes dans votre cas vous aideront plus d'un:

- (NSData*) dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError 
{ 
    NSData * myData = [NSKeyedArchiver archivedDataWithRootObject:bcmwc.bindingsController.arrangedObjects]; 
    // You should be handling nil (setting a descriptive error) here if (!myData)... 
    return data; // breakpoint here; you should now see myData is likely nil 
} 
+0

J'ai écrit dans ma question - problème est que la méthode dataOfType n'est pas appelée, pas "pourquoi l'archivage ne fonctionne pas?" – badeleux

+0

Vous avez écrit à l'origine que rien ne se passe lorsque vous cliquez sur Enregistrer (mais pas plus d'informations que cela). Ensuite, vous l'avez édité après avoir écrit ma réponse pour inclure le reste. J'ai répondu à la question que vous avez posée à l'origine. –

Questions connexes