Pergunta

Há um tipo de arquivo minha importação aplicativo, mas não salvar. Eu adicionei uma entrada para os tipos de documentos e configurá-lo para somente leitura, mas que não produz o comportamento de importação que eu estou procurando. Em vez disso, meu aplicativo só vai abrir o arquivo e quando eu salvar o arquivo original é substituído no meu próprio formato de arquivo.

Como configurar meu documento ou documento tipos para fazer com que um novo documento é criado com os dados do documento original, em vez do ser original abriu?

Foi útil?

Solução

1. Declare os tipos de arquivo como Tipos de documento

Dentro de seu projeto Xcode, adicione um Tipo de Documento para todos os formatos de arquivos seu aplicativo suporta. Defina o Função de cada tipo de acordo com as habilidades do seu aplicativo:

  • Mark ler / escrever tipos de arquivos capazes como editor ;
  • Marcar importar apenas os tipos de arquivo como Visualizador .

Defina o Class para o tipo de documento que pretende lidar com cada tipo de arquivo. Uma classe de documento pode lidar com vários tipos de arquivos.

No exemplo abaixo, existem três tipos de arquivos declarou: font-pilão, OTF e de TTF. O primeiro, font-pilão, é o formato nativo do aplicativo. Este tipo tem o papel editor .

Os dois formatos restantes, OTF e de TTF, podem ser importados, mas não por escrito pela aplicação; assim, eles são marcados como Visualizador .

Tipos exemplo de documento

2. tipos de arquivos adicionais no seu NSDocument subclasse

Com os tipos de documentos adicionados, a aplicação permitirá que os usuários automaticamente para abrir arquivos dos tipos especificados.

Você precisa adicionar código de manipulação de tipo de arquivo para sua classe de documento. No caso ideal, adicionar o código de ramificação para o método 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 // ...

}

O self.fileURL = nil; é importante. Ao definir fileURL a zero, você está dizendo que o documento não está associada com qualquer arquivo em disco e deve ser tratado como um novo documento.

Para permitir a auto-saving, implementar o método autosavingFileType NSDocument para retornar o tipo de arquivo primário.

Outras dicas

Alex, obrigado pela sua resposta, mas eu encontrei uma maneira que eu gosto um pouco mais:

- (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)
    }
}

Desta forma, ainda é possível usar o sistema de documento fornecido pela Cacau em vez fo rolando meu próprio.

Eu também documentou a solução aqui: http://www.cocoadev.com/ index.pl?CFBundleTypeRole um pouco abaixo na página.

Eu não acredito que a funcionalidade de importação é suportado por padrão em Cocoa. Quando o usuário clica no botão Abrir no painel aberto, as chamadas quadro openDocumentWithContentsOfURL:display:error: em NSDocumentController. Este é o lugar onde os números do sistema documento que tipo de arquivo que você está abrindo e consultas com o arquivo Info.plist para descobrir qual subclasse NSDocument usar para abrir o documento.

Você poderia subclasse NSDocumentController e substituir o método openDocumentWithContentsOfURL:display:error: para interceptar os tipos de arquivos que devem ser importadas em vez de abertas. Em sua subclasse NSDocument, escrever um novo initializer com um nome como initWithImportedContentsOfURL:type:error: (ou algo com um nome melhor :-)) para criar um novo documento sem título e ler o conteúdo do arquivo importado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top