ouvrir un document sans l'ouvrir

laudemalaudema Membre
02:36 modifié dans API AppKit #1
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 ?

Réponses

  • 02:36 modifié #2
    Tu mets un simple return NO? ou bien tu as mis du code avant?
    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)
  • laudemalaudema Membre
    02:36 modifié #3
    dans 1242487398:

    Tu mets un simple return NO? ou bien tu as mis du code avant?
    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
    if ([self izAnImageType:zeType] ) <br />		[self changeImageForURL:zeURL];<br />	return [super readFromURL:zeURL ofType:zeType error:zeError];
    


    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 ...
  • laudemalaudema Membre
    02:36 modifié #4
    dans 1242487398:

    Tu mets un simple return NO?


    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..
  • mpergandmpergand Membre
    02:36 modifié #5
    On peut empêcher l'ouverture automatique:

    - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename<br />{<br />	NSLog(@&quot;%@&quot;, filename);<br />	NSError* error=nil;<br />	NSDocumentController* docController=[NSDocumentController sharedDocumentController];<br />	[docController openDocumentWithContentsOfURL:[NSURL fileURLWithPath:filename] display:YES error:&amp;error];<br />	return YES;<br />}<br />
    
  • laudemalaudema Membre
    02:36 modifié #6
    dans 1242507245:

    On peut empêcher l'ouverture automatique:

    - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename<br />{<br />	NSLog(@&quot;%@&quot;, filename);<br />	NSError* error=nil;<br />	NSDocumentController* docController=[NSDocumentController sharedDocumentController];<br />	[docController openDocumentWithContentsOfURL:[NSURL fileURLWithPath:filename] display:YES error:&amp;error];<br />	return YES;<br />}<br />
    



    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 ..
  • laudemalaudema Membre
    02:36 modifié #8
    dans 1242507245:

    On peut empêcher l'ouverture automatique:

    - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename<br />{<br />	NSLog(@&quot;%@&quot;, filename);<br />	NSError* error=nil;<br />	NSDocumentController* docController=[NSDocumentController sharedDocumentController];<br />	[docController openDocumentWithContentsOfURL:[NSURL fileURLWithPath:filename] display:YES error:&amp;error];<br />	return YES;<br />}<br />
    


    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 ...
Connectez-vous ou Inscrivez-vous pour répondre.