[résolu] Comment ouvrir une sauvegarde depuis le Finder?

HerveHerve Membre
avril 2011 modifié dans API AppKit #1
Bonjour,

J'ai fait une appli sans NSDocument. J'ai fait la procédure de sauvegarde avec NSKeyedArchiver + NSCoder.
On peut ouvrir les sauvegardes depuis l'application avec un menu "Open" qui marche super. Lorsqu'on fait contrôle+click sur la sauvegarde dans le finder, l'OS indique bien la bonne application.
Mais si je double clique sur cette sauvegarde, l'application est bien lancée mais un message d'alerte apparaà®t disant que elle ne peut ouvrir ce type de fichier (qui a une extension propre, bien sûr). L'application est correctement initialisée et fonctionne très bien ensuite.

J'ai essayé :
- de créer artificiellement un type de document dans "InfoPList". Je m'y suis peut-être mal pris, mais cela n'a pas marché.
- d'implémenter une méthode "awakeFromNib" en plus de la méthode "init" dans le "AppController". Mais comment lui dire le nom de l'archive? La classe sauvegardant les données est une classe "MesDonnees" indépendante. Je ne trouve pas, j'ai pensé à  quelque chose comme @selector...

Ce doit être simple, mais pour l'instant je sèche. Quelqu'un ici connaà®trait l'astuce peut-être? Merci.

Réponses

  • LexxisLexxis Membre
    12:57 modifié #2
    Bonjour,
    as tu essayé les méthodes du "delegate" de l'application comme:
    application:openFile ou application:openFiles: ?

    Je ne sais pas si cela correspond à  tes besoins... mais à  tout hasard voici la documentation.
  • HerveHerve Membre
    12:57 modifié #3
    Merci Lexxis pour ta réponse.

    Je dois avoir du mal à  l'employer, pour l'instant le problème est le même.

    J'ai fait cela :
    - (BOOL)application:(NSApplication *)application openFile:(NSString *)filename{<br />&nbsp; &nbsp; self = [super init];<br />&nbsp; &nbsp; if (self != nil) {<br />	mesDonnees = [[MesDonnees alloc]init];<br />	nomDeFichier = [[NSString alloc]initWithString:@&quot;&quot;];<br />&nbsp; &nbsp; &nbsp; &nbsp; application = NSApp;&nbsp; //est-ce utile de le préciser?<br />&nbsp; &nbsp; [self setNomDeFichier : filename];<br />&nbsp; &nbsp; [nomDeFichier retain];<br />&nbsp; &nbsp; mesDonnees = [NSKeyedUnarchiver unarchiveObjectWithFile:nomDeFichier]; <br />&nbsp; &nbsp; [mesDonnees retain];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //(puis utilisation de mesDonnees copié dans le menu &quot;ouvrir&quot;)<br />&nbsp; &nbsp; return YES;}<br />&nbsp; &nbsp; <br />}
    


    (mesDonnees implémentent initWithCoder)

    L'application est ouverte mais l'archive n'est pas chargée. L'exemple donné dans la doc Apple semble bien utiliser cette méthode pour initialiser l'application. Impossible d'utiliser "awakeFromNib" si je ne peux utiliser le nom du fichier dans la méthode de toutes façon, puisque j'en ai besoin pour
    mesDonnees = [NSKeyedUnarchiver unarchiveObjectWithFile:nomDeFichier]; <br />&nbsp;
    


    Bon, si quelqu'un connaà®t l'astuce, je suis preneur, merci.
  • HerveHerve Membre
    12:57 modifié #4
    Ce doit être la bonne méthode. J'ai l'impression qu'elle n'est pas appelée. J'ai supprimé les
    self = [super init];<br />&nbsp; &nbsp; if (self != nil) {<br />	mesDonnees = [[MesDonnees alloc]init];<br />	nomDeFichier = [[NSString alloc]initWithString:@&quot;&quot;];<br />&nbsp; &nbsp; &nbsp; &nbsp; application = NSApp;&nbsp; //est-ce utile de le préciser?
    

    qui n'ont visiblement pas lieu d'être. Je n'ai gardé que les NSKeyedUnarchiver.  Cette méthode est déclarée dans l'entête de la classe. Peut-être faut-il la mettre dans le main? (pas essayé, mais je vois plus rien...)

    Bonne nuit!
  • CéroceCéroce Membre, Modérateur
    12:57 modifié #5
    dans 1303320614:

    - (BOOL)application:(NSApplication *)application openFile:(NSString *)filename{<br />&nbsp; &nbsp; self = [super init];<br />&nbsp; &nbsp; if (self != nil) {<br />
    


    ça, c'est du grand n'importe quoi. Il ne s'agit pas d'une méthode d'init, mais d'une méthode déléguée de NSApplication.
    Quand un fichier est déposé, l'application appelle la méthode -application:openFile: de son délégué (NSApplication possède une outlet delegate, regarde dans IB, tu verras que l'outlet est connectée à  l'instance de AppDelegate).


    -awakeFromNib est appelée dans deux cas:
    - pour un objet présent dans un nib, quand il est instancié
    - pour un objet qui désarchive un nib (NSWindowController, NSViewController...) quand les objets du nib ont été instanciés.
    Il ne faut pas l'utiliser dans cette situation car tu peux très bien avoir l'application lancée (donc avoir le nib désarchivé) et double-cliquer le fichier.

    Pourquoi ne pas utiliser NSDocument ? Il a beaucoup d'avantages:
    - une fenêtre par fichier
    - un UndoManager par fichier
    - les documents apparaissent dans Fichier > Ouvrir fichier récent
    - on peut déplacer ou renommer un fichier dans le Finder pendant qu'il est ouvert
    etc.

    Là , tu es en train de réinventer la roue pour faire quelque chose de moins bien.
  • HerveHerve Membre
    12:57 modifié #6
    Merci beaucoup Céroce. Comme à  ton habitude, tes conseils sont les bons.

    La méthode "delegate" par connexion dans IB a marché. Merci.

    En fait, en particulier parce que j'utilise dans cette appli un menu modifiable, je n'ai aps voulu travailler à  partir de "Document Based Application". Il faut par contre que je retravaille cette classe NSDocument. Visiblement, je ne l'ai pas bien comprise.

    Merci encore Lexxis et Céroce : problème résolu.
Connectez-vous ou Inscrivez-vous pour répondre.