Using WebView in a modal NSWindow not working?

前端 未结 2 979
轻奢々
轻奢々 2021-01-20 13:26

How should you use WebKit\'s WebView with a modal dialog?

[_webView setMainFrameURL:[NSString fromStdString:url]];
[_nsWindow makeKeyAndOrderFront:nil];
retu         


        
2条回答
  •  情歌与酒
    2021-01-20 13:53

    I've been searching for solutions and now I can use WebView on modal session using following code. Without using -runMode:beforeDate my WebView cannot process keyboard or mount events:

    - (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];
    }
    

    You need to call [NSApp stopModal], [NSApp abortModal] or [NSApp stopModalWithCode:yourReturnCode] somewhere like this:

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

    Links:

    • [1]:http://www.dejal.com/blog/2007/01/cocoa-topics-case-modal-webview
    • [2]:http://lists.apple.com/archives/cocoa-dev/2008/Apr/msg02260.html

提交回复
热议问题