cocoa - webkitview - ¿Usar WebView en una NSWindow modal no funciona?
wk webview (2)
WebView
solo funciona en el ciclo principal y, por lo tanto, no coopera en este caso. Una solución sería ejecutar la sesión modal usted mismo y mantener el ciclo principal activo manualmente (similar a lo que se propone aquí ). P.ej:
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];
Tenga en cuenta que probablemente desee utilizar algo como -runMode:beforeDate:
lugar, para mantener baja la carga de la CPU.
¿Cómo debería usar WebView de WebKit con un diálogo modal?
[_webView setMainFrameURL:[NSString fromStdString:url]];
[_nsWindow makeKeyAndOrderFront:nil];
return [NSApp runModalForWindow:_nsWindow];
El código anterior solo funciona en Mac OS 10.6. Usando 10.5 esto no está navegando a la URL especificada. Sin el runModalForWindow, todo está funcionando.
He estado buscando soluciones y ahora puedo usar WebView en una sesión modal usando el siguiente código. Sin usar -runMode:beforeDate
mi WebView no puede procesar eventos de teclado o montaje:
- (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];
}
Necesita llamar a [NSApp stopModal]
, [NSApp abortModal]
o [NSApp stopModalWithCode:yourReturnCode]
algún lugar como este:
- (void)windowWillClose:(NSNotification *)notification
{
NSLog(@"windowWillClose");
[NSApp stopModal];
}
Campo de golf: