2010-11-12 2 views
3

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

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

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

ответ

8

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

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: вместо того, чтобы держать нагрузку на процессор вниз.

+0

Был ли этот сайт там 2 часа назад? Серьезно, я не знаю, как я мог пропустить это. Большое спасибо за это! – Dodo

+0

@ Dodo: Было легче (переоткрыть) для меня, я думаю - я уже прошел более надуманную версию этой проблемы :) –

1

Я искал решения, и теперь я могу использовать 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]; 
} 

Ссылки:

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