ouvrir un document sans l'ouvrir
laudema
Membre
Je n'ai pas su trouver les termes pour une recherche fructueuse ici ou dans Google pour obtenir ça:
L'application transfert d'image permet de choisir une application qui lira l'image faite par un scanner. Je voudrais m'en servir pour récupérer le chemin de l'image scannée et l'affecter à une variable d'un de mes objets (et possiblement l'afficher dans une ImageView).
Pour ça j'ai regardé le delegate de l'application (shouldOpenFile) mais il ne semble pas appelé.
Alors j'ai mis le type "tiff" dans ceux que peut lire mon application et je peux voir le chemin dans la méthode - (BOOL)readFromURL:(NSURL*)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError de MyDocument mais ça finit toujours en crash une fois qu'il arrive dans la méthode - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError.
J'ai essayé de mettre return NO; dans readFromURL mais ça crashe également. Toujours avec EXC_BAD_ACCESS
Comment peut on faire ce genre de manipulation ?
L'application transfert d'image permet de choisir une application qui lira l'image faite par un scanner. Je voudrais m'en servir pour récupérer le chemin de l'image scannée et l'affecter à une variable d'un de mes objets (et possiblement l'afficher dans une ImageView).
Pour ça j'ai regardé le delegate de l'application (shouldOpenFile) mais il ne semble pas appelé.
Alors j'ai mis le type "tiff" dans ceux que peut lire mon application et je peux voir le chemin dans la méthode - (BOOL)readFromURL:(NSURL*)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError de MyDocument mais ça finit toujours en crash une fois qu'il arrive dans la méthode - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError.
J'ai essayé de mettre return NO; dans readFromURL mais ça crashe également. Toujours avec EXC_BAD_ACCESS
Comment peut on faire ce genre de manipulation ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu as bien mis ça dans une sous-classe de NSDocument?
Tu as bien indiqué la classe NSDocument qui doit être utilisée pour ouvrir les fichiers de type "tiff" (dans le info.plist à la clé "Cocoa NSDocument Class" de ton extension)
Dans readFromUrl:zeURL ..:zeType ..:zeError.. j'ai juste mis
et dans readFromData je refais le test sur le type et je mets return NO si c'est c'est une image puisque j'ai déjà récupéré l'info que je voulais.
j'espérais m'en sortir comme ça mais ça ne passe pas.
Si je fais return NO dans readFromURL plutôt que passer par [super readFromURL:...] ça passe pas non plus ...
Oui (ou presque voire précédent message) mais en fait pourquoi j'ai mis NO ?
Je l'avais mis intuitivement (si on peut dire) mais je vient d'essayer YES et il m'ouvre un nouveau document ce qui n'est pas tout à fait ce que je veux.
A la base un document tient un tableau (je suis le livre déjà moultement cité de A.H) et c'est ce tableau d'objets que j'archive et recharge. Depuis peu avec quelques autres éléments de mon interface. Donc tout le "graphe" de mes objets à un moment donné.
Alors qu'ici je ne cherche qu'à récupérer une des infos du document ouvert par l'application : son emplacement ! Mais je n'ai pas trouvé comment faire ça dans la doc ...
C'est pourquoi je me tourne vers ce forum mais c'est sûr qu'un week-end n'est pas l'idéal pour poser ce genre de questions..
Maintenant je n'arrive plus à ouvrir mes documents enregistrés
Il faudra que je creuse ça en testant le type de document. Demain j'espère: aujourd'hui je suis de service ailleurs que sur mon ordinateur et n'aurais hélas pas le temps.
Il y a aussi les AppleEvents: en mettant return NO à la fin de ton code j'ai aussi un EXC_BAD_ACCESS. Si j'ai fermé l'application et que c'est Transfert d'Image qui la ré-ouvre je peux voir que c'est en répondant à un Event.
Reste à savoir lequel et le piéger ..
1 com.apple.AppKit 0x92af26e8 -[NSDocumentController _willPresentOpeningError:forURL:] + 67
2 com.apple.AppKit 0x92af4021 -[NSDocumentController(NSInternal) _openFile:] + 197
3 com.apple.AppKit 0x92a0518e -[NSApplication _doOpenFile:ok:tryTemp:] + 637
4 com.apple.AppKit 0x9299070b -[NSApplication _doOpenFiles:] + 242
5 com.apple.AppKit 0x929905f9 -[NSApplication(NSAppleEventHandling) _handleAEOpenDocuments:] + 88
6 com.apple.AppKit 0x926b2713 -[NSApplication(NSAppleEventHandling) _handleCoreEvent:withReplyEvent:] + 297
7 com.apple.Foundation 0x960dbaaf -[NSAppleEventManager dispatchRawAppleEvent:withRawReply:handlerRefCon:] + 655
8 com.apple.Foundation 0x960db7bf _NSAppleEventManagerGenericHandler + 223
9 com.apple.AE 0x93c2e648 aeDispatchAppleEvent(AEDesc const*, AEDesc*, unsigned long, unsigned char*) + 144
10 com.apple.AE 0x93c2e57e dispatchEventAndSendReply(AEDesc const*, AEDesc*) + 44
11 com.apple.AE 0x93c2e425 aeProcessAppleEvent + 177
12 com.apple.HIToolbox 0x90c8e961 AEProcessAppleEvent + 38
13 com.apple.AppKit 0x926aff21 _DPSNextEvent + 1189
14 com.apple.AppKit 0x926af5c0 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
15 com.apple.AppKit 0x926a85fb -[NSApplication run] + 795
Malheureusement je n'ai pas trouvé dans la doc sur les AppleEvents lequel était impliqué: ne me reste qu'à journaliser tous les événements de l'appli et repérer celui qui correspond. En plus ça se fait dans le délégué de NSApp pas dans MyDocument, c'est pour ça que je n'avais pas creusé cette voie au départ. Peut être en enregistrant MyDocument observer de NSApp avec le chemin qui va bien ..
http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CoreAppArchitecture/CoreAppArchitecture.html
Plus de détails:
http://developer.apple.com/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/SApps_handle_AEs/SAppsHandleAEs.html#//apple_ref/doc/uid/20001239
Absolument, mon erreur était de mettre return NO; puisque je ne voulais pas ouvrir de document. Du coup mon appli envoyait un vilain message disant qu'elle ne savait pas ouvrir ces fichiers.
Mon idée de passer par les AppleEvents n'était pas une bonne idée. C'est d'ailleurs marqué dans la doc d' utiliser les AppleEvents seulement si vous n'avez pas su gérer avec les méthodes déléguées de NSApplication (ou NSDocument je ne sais plus vraiment).
Maintenant tout fonctionne. J'aurais appris au passage sur les AppleEvents et aussi sur NSWorkspace (pour trouver le type d'un fichier).
Merci pour m'avoir mis sur la bonne voie, la prochaine fois j'éviterais de toucher à Cocoa et travailler à autre chose en même temps ...