Использование WebView в модальном NSWindow не работает? - PullRequest
3 голосов
/ 12 ноября 2010

Как использовать WebKit WebView с модальным диалогом?

[_webView setMainFrameURL:[NSString fromStdString:url]];
[_nsWindow makeKeyAndOrderFront:nil];
return [NSApp runModalForWindow:_nsWindow];

Предыдущий код работает только в Mac OS 10.6. При использовании 10.5 это не переход к указанному URL. Без runModalForWindow все работает.

Ответы [ 2 ]

8 голосов
/ 12 ноября 2010

WebView работает только в основном цикле и, следовательно, не взаимодействует в этом случае. Одним из решений было бы запустить модальный сеанс самостоятельно и поддерживать основной цикл вручную (аналогично тому, что предлагается здесь ). E.g.:

NSModalSession session = [NSApp beginModalSessionForWindow:yourWindow];
int result = NSRunContinuesResponse;

// Loop until some result other than continues:
while (result == NSRunContinuesResponse)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Run the window modally until there are no events to process:
    result = [NSApp runModalSession:session];

    // Give the main loop some time:
    [[NSRunLoop currentRunLoop] limitDateForMode:NSDefaultRunLoopMode];

    // Drain pool to avoid memory getting clogged:
    [pool drain];
}

[NSApp endModalSession:session];

Обратите внимание, что вы, вероятно, хотите использовать что-то вроде -runMode:beforeDate: вместо того, чтобы снизить нагрузку на процессор.

1 голос
/ 13 июля 2015

Я искал решения, и теперь я могу использовать WebView на модальной сессии, используя следующий код.Без использования -runMode:beforeDate мой WebView не может обрабатывать события клавиатуры или монтирования:

- (void) OpenURL:(const char *)_url
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [NSApplication sharedApplication];
    [NSApp setDelegate:self];

    NSString *url = [NSString stringWithUTF8String:_url];

    NSLog(@"OpenURL: %@", url);

    NSRect windowRect = NSMakeRect(10.0f, 10.0f, 800.0f, 600.0f);

    NSWindow *window = [[NSWindow alloc] initWithContentRect:windowRect 
        styleMask:(NSResizableWindowMask|NSClosableWindowMask|NSTitledWindowMask) 
        backing:NSBackingStoreBuffered defer:NO];
    [window setDelegate:self];

    WebView *webview = [[WebView alloc] initWithFrame:windowRect 
        frameName:@"mainFrame" 
        groupName:nil];
    [webview setFrameLoadDelegate:self];
    [[webview mainFrame] 
          loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];

    [window setContentView:webview];
    [window makeKeyAndOrderFront:nil];

    // Modal Session

    NSModalSession session = [NSApp beginModalSessionForWindow:window];
    _result = NSModalResponseContinue;

    while (_result == NSModalResponseContinue) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        _result = [NSApp runModalSession:session];

        // The event loop is a runloop data source, so any ui event will 
        // wake up the source and make this method returns, and so 
        // you can block the run loop and tell him to wait that
        // something append. [2]
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                    beforeDate:[NSDate distantFuture]];

        [self doSomeWork];

        [pool drain];
    }
    [NSApp endModalSession:session];

    [pool release];
}

Вам нужно вызвать [NSApp stopModal], [NSApp abortModal] или [NSApp stopModalWithCode:yourReturnCode] где-то так:

- (void)windowWillClose:(NSNotification *)notification
{
    NSLog(@"windowWillClose");
    [NSApp stopModal];
}

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...