Запретить открытие новых NSDocuments и показать предупреждение - PullRequest
3 голосов
/ 01 апреля 2011

У меня есть приложение на основе NSDocument, в котором я хочу ограничить количество одновременно открытых документов (для облегченной версии). Я просто хочу иметь n документов, и если пользователь пытается открыть больше, чем n , показать сообщение со ссылкой для полной загрузки приложения.

Мне удалось подсчитать количество документов, используя NSDocumentController, и внутри readFromFileWrapper я могу вернуть FALSE. Это препятствует открытию нового документа, но показывает стандартное сообщение об ошибке. Я не знаю, как этого избежать. Я хотел бы открыть новое окно с кончика.

Есть ли способ предотвратить отображение стандартного сообщения об ошибке NSDocument при возврате FALSE из readFromFileWrapper? Или есть какой-то другой способ предотвратить открытие документа до вызова readFromFileWrapper?

1 Ответ

5 голосов
/ 01 апреля 2011

Попробуйте метод init, который вызывается как при создании нового документа, так и при открытии сохраненного документа.Вы просто возвращаете ноль, если лимит был достигнут.Тем не менее я не пробовал это, и это может привести к отображению той же ошибки.

- (id)init {
    if([[NSDocumentController documents] count] >= DOCUMENT_LIMIT) {
        [self release];
        return nil;
    }
    ...
}

В случае, если отображается та же ошибка, вы можете использовать пользовательский NSDocumentController.Ваши реализации будут проверять количество открытых документов, отображать сообщение на пределе и иначе вызывать нормальную реализацию.

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError **)outError {
    if([[self documents] count] >= DOCUMENT_LIMIT) {
        // fill outError
        return nil;
    }
    return [super openUntitledDocumentAndDisplay:displayDocument error:outError];
}
- (id)openDocumentWithContentsOfURL:(NSURL *)absoluteURL display:(BOOL)displayDocument error:(NSError **)outError {
    NSDocument *doc = [self documentForURL:absoluteURL];
    if(doc) { // already open, just show it
        [doc showWindows];
        return doc;
    }
    if([[self documents] count] >= DOCUMENT_LIMIT) {
        // fill outError
        return nil;
    }
    return [super openDocumentWithContentsOfURL:absoluteURL display:displayDocument];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...