NSTextПосмотрите, как отключить «У вас нет файла« xxx », и у вас нет разрешения на запись в него». - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть NSTextView в моем приложении на основе документов. Если я открываю файл, к которому у меня есть только права на чтение, и изменяю содержимое NSTextView, я получаю диалоговое окно с указанием:

У вас нет файла «xxx», и у вас нет разрешения на запись в него.

Но это текстовое представление фактически не взаимодействует с документом, который я открыл. Можно ли как-то отменить это поведение NSTextView?

1 Ответ

0 голосов
/ 08 ноября 2018

Код, который я придумал, выглядит следующим образом:

#import <JRSwizzle/JRSwizzle.h>

@implementation NSDocument (Swizzle)

+ (void) load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSError * error = nil;

        SEL srcSelection = NSSelectorFromString(@"_checkAutosavingThenUpdateChangeCount:");
        SEL dstSelector = @selector(MyCheckAutosavingThenUpdateChangeCount:);

        [[NSDocument class] jr_swizzleMethod: srcSelection
                                      withMethod: dstSelector
                                           error: &error];
        NSLog(@"Error: %@", error);
    });
} // End of load

- (void) MyCheckAutosavingThenUpdateChangeCount: (unsigned long long) arg1
{
    // On updateChangeCount, we are going to catch if the firstresponder is our query window.
    // If the first responder is, then we will not mark a change. This is for two reasons:
    // 1. This is an sqlite app. Editing the query editor dosen't actually update our
    // document.
    // 2. If we do mark the document as updated and the query editor marks a change, we get
    // a popup stating that the document cant be updated, needs to be duplicated, yada, yada.
    NSWindow * keyWindow = [[NSApplication sharedApplication] keyWindow];
    if(NULL != keyWindow)
    {
        NSResponder * responder = keyWindow.firstResponder;
        // My code uses a NSTextView subclass. For copy/paste I'm just entering NSTextView.
        if([responder isKindOfClass: NSClassFromString(@"NSTextView")])
        {
            return;
        }
    }

    [self MyCheckAutosavingThenUpdateChangeCount: arg1];
} // End of MyCheckAutosavingThenUpdateChangeCount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...