2015-06-26 10 views
0

В своих документах мое приложение использует много активов, которые относятся к пути к документу. Таким образом, документ должен быть сохранен до добавления активов. Как я могу принудительно вызвать [NSDocument saveDocumentAs]?принудительно сохранить NSDocument после создания

мне удалось сделать его части: создавая свой собственный контроллер документа, так и внутри openUntitledDocumentAndDisplay: заставить вызов так:

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError **)outError 
{ 
    NSDocument * res = [super openUntitledDocumentAndDisplay:displayDocument error:outError]; 
    [res saveDocumentAs:self]; 


    return res; 
} 

Это заставляет сохранять диалог появляться, но, к сожалению, я не могу проверить отменит ли пользователь отменить: вызов saveDocumentAs является асинхронным и продолжается немедленно!

Есть ли способ исправить это?

ответ

0

У меня есть аналогичная вещь в моем приложении, в моем случае, если пользователь пытается что-то сделать, я подтягиваю подсказку, чтобы сказать: «Это требует, чтобы вы сначала сохранили документ» с кнопками для отмены или сохранения.

Если вы хотите, чтобы это было абсолютно принудительно, вместо использования saveDocumentAs просто отобразите свой собственный NSSavePanel. Запустите его по-разному, проверьте результат, сохраните документ с результатом, и если это не пройдет гладко, вызовите его снова. Вы можете проверить, сохранен ли документ, ища допустимое значение для его пути к файлу.

+0

Это просто, что я не все, что опыт работы с какао рамки и NSSavePanel выглядит довольно сложной. Но я думаю, что у меня нет другого выбора. Спасибо за информацию ! – cocoabeginner

+0

Я заработал! Но после вызова [saveToURL: url] элемент меню «Сохранить ...» остается недоступным! Даже после изменения документа я не могу сохранить :-(Открытие документа (пустого) позволит мне снова сохранить.Только свежеприготовленные документы не могут быть сохранены :-( – cocoabeginner

+0

call updateChangeCount: правильно указать, что есть что-то, что нужно сохранить. Намного лучше реализовать отмену действий. –

0

У меня была аналогичная проблема. С помощью: saveDocumentWithDelegate: (id) delegate didSaveSelector: (SEL) didSaveSelector contextInfo: (void *) contextInfo вы можете отложить обработку (или нет) до завершения диалога сохранения документа. Это означает, что вы можете узнать, отменен ли пользователь или нет. Вы разделите свою обработку на две части, сделайте все, что вам нужно, и положите оставшуюся часть (которая зависит от успешного сохранения) в другой метод. Если вы используете что-то вроде:

[self saveDocumentWithDelegate:self didSaveSelector:@selector(actuallyDoIt: didSave: contextInfo:) contextInfo:nil]; 

Документ будет сохранен, но, критически, если он не был сохранен ранее, Сохранить откроется диалоговое окно, так что пользователь может ввести имя файла. После того, как он это сделал или отменил, ваш метод actualDoIt: (или что-то еще) вызывается. Параметр didSave: указывает, действительно ли произошло спасение (по сути, пользователь отменил), чтобы вы могли либо продолжать, либо предлагать предупреждение, вежливо объясняющее пользователю, что ничего не произойдет до тех пор, пока они не сохранятся.

0

NSSavePanel может работать как модно. Вот как он может/должен выглядеть.

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError *__autoreleasing *)outError 
{ 
    Document *document; 
    NSSavePanel *panel = [NSSavePanel savePanel]; 
    panel.prompt = @"Create"; 
    NSInteger modalCode = [panel runModal]; 
    if (modalCode == NSModalResponseOK) { 
    NSURL *URL = [panel URL]; 
    NSError *docError; 
    document = [[Document alloc] initWithType:nil & docError]; 
    [document saveToURL:URL ofType:nil forSaveOperation:NSSaveOperation completionHandler:^(NSError *error){ 
     if(error) { 
     return nil; 
     } 
     [self addDocument:document]; 
     [document makeWindowControllers]; 
     if (displayDocument) { 
     [document showWindows]; 
     } 
    }]; 
    } 

    return document; 
} 

Подытоживая для справки:

  1. Создание пользовательских nsdocumentsubclass в XIB (без XIB -> приложение сделал отделка запускающего)
  2. переопределение openUntitledDocumentAndDisplay

    • (NSData *) dataOfType: (NSString *) typeName error: (NSError **) outError;

 Смежные вопросы

  • Нет связанных вопросов^_^