Question

Il y a un type de fichier mon importation d'application, mais pas enregistrer. J'ai ajouté une entrée aux types de documents et mis à lecture seule, mais cela ne donne pas le comportement des importations que je suis à la recherche. Au lieu de cela, mon application va simplement ouvrir le fichier et lorsque j'enregistre le fichier original est écrasé dans mon propre format de fichier.

Comment configurer mon document ou types de documents pour faire en sorte qu'un nouveau document est créé avec les données du document original, au lieu de? L'ouverture d'origine

Était-ce utile?

La solution

1. Déclarer les types de fichiers comme les types de documents

Dans votre projet Xcode, ajoutez un Type de document pour tous les formats de fichiers vos supports d'application. Réglez le Rôle de chaque type en fonction des capacités de votre application:

  • Mark lecture / écriture des types de fichiers capables Editor ;
  • importation Mark uniquement les types de fichiers Viewer .

Régler la Classe du type de document vous voulez gérer chaque type de fichier. Une classe de documents peut gérer plusieurs types de fichiers.

Dans l'exemple ci-dessous, il existe trois types de fichiers déclarés: police-pestle, OTF et TTF. La première, font-pestle, est le format natif de l'application. Ce type a le rôle Editor .

Les deux formats restants, FEO et TTF, peuvent être importés mais pas écrits par l'application; ainsi ils sont marqués comme Viewer .

Exemple Types de document

2. types de fichiers supplémentaires dans votre sous-classe NSDocument

Avec les types de documents ajoutés, l'application permettra aux utilisateurs d'ouvrir automatiquement les fichiers des types spécifiés.

Vous devez ajouter le code de gestion de type de fichier à votre classe de document. Dans le cas idéal, ajoutez le code de branchement à la méthode readFromData:ofType:error::

- (BOOL)readFromData:(NSData*)someData ofType:(NSString*)typeName error:(NSError**)outError
{
    if ([NSWorkspace.sharedWorkspace type:@"eu.miln.font-pestle" conformsToType:typeName] == YES)
    {
        // read native format
    }
    else if ([NSWorkspace.sharedWorkspace type:@"public.opentype-font" conformsToType:typeName] == YES)
    {
        // read import only format

        // disassociate document from file; makes document "untitled"
        self.fileURL = nil;
        // associate with primary file type
        self.fileType = @"eu.miln.font-pestle";

    }
    else // ...

}

Le self.fileURL = nil; est important. En mettant en fileURL à zéro, vous dites que le document est associé à aucun fichier sur disque et doit être traité comme un nouveau document.

Pour permettre l'enregistrement automatique, mettre en œuvre la méthode NSDocument autosavingFileType pour retourner le type de fichier primaire.

Autres conseils

Alex, merci pour votre réponse, mais j'ai trouvé une façon que je l'aime un peu plus:

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName
               error:(NSError **)outError
{
    *outError = nil;
    if ([typeName isEqualToString:@"SomeReadOnlyType"])
    {
        // .. (load data here)
        [self setFileURL:nil];

        return result;
    }
    else
    {
        // .. (do whatever you do for other documents here)
    }
}

De cette façon, il est toujours possible d'utiliser le système de document fourni par Cocoa au lieu fo rouler mon propre.

J'ai aussi documentée ici la solution: http://www.cocoadev.com/ index.pl?CFBundleTypeRole un peu en bas de la page.

Je ne crois pas que la fonctionnalité d'importation est prise en charge par défaut dans Cocoa. Lorsque l'utilisateur clique sur le bouton Ouvrir dans le panneau ouvert, le cadre appelle openDocumentWithContentsOfURL:display:error: sur NSDocumentController. C'est là le système de documents détermine le type de fichier que vous ouvrez et consulte le fichier Info.plist pour savoir quelle sous-classe NSDocument à utiliser pour ouvrir le document.

Vous pouvez sous-classe NSDocumentController et remplacer la méthode openDocumentWithContentsOfURL:display:error: pour intercepter les types de fichiers qui doivent être importés plutôt que de les ouvrir. Dans votre sous-classe NSDocument, écrire un nouveau initialiseur avec un nom comme initWithImportedContentsOfURL:type:error: (ou quelque chose avec un meilleur nom :-)) pour créer un nouveau document sans titre et lu dans le contenu du fichier importé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top