2017-04-10 4 views
0

Ich mache super-einfachen Ein-Seiten-Browser in reinem Objective-C, und alles ist gut außer den Tastaturereignissen. Ich kann einfach keine Daten in Webformularen mit der Tastatur eingeben! Mausoperationen wie das Einfügen in Webforms und das Klicken auf Links funktionieren, aber die Eingabe in Webforms funktioniert nicht!Cocoa WebView reagiert nicht auf Tastaturereignisse

Code:

#import <WebKit/WebKit.h> 

@interface MyWebView : WebView 
{ 
} 
@end 

@implementation MyWebView 

-(void)windowWillClose:(NSNotification *)notification 
{ 
    [NSApp terminate:self]; 
} 

-(BOOL)becomeFirstResponder 
{ 
    printf("becomeFirstResponder\n"); // this message always appears 
    return YES; 
} 

-(void)keyDown:(NSEvent *)event 
{ 
    printf("keydown\n"); // this message never appears 
    // should I use this code to make keyboard work? 
    [self interpretKeyEvents:[NSArray arrayWithObject:event]]; 
} 

@end 

int main(void) { 
    NSRect contentRect; 
    NSWindow *window = nil; 
    WebView *webView = nil; 
    NSString *urlForAuthentication = nil; 

    NSApp = [NSApplication sharedApplication]; 

    contentRect = NSMakeRect(100, 100, 700, 700); 
    window = [[NSWindow alloc] initWithContentRect:contentRect styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask backing:NSBackingStoreBuffered defer:NO]; 
    if (!window) { 
     printf("!window\n"); 
     goto end; 
    } 
    webView = [[MyWebView alloc] initWithFrame:window.contentLayoutRect frameName:nil groupName:nil]; 
    if (!webView) { 
     printf("!webView\n"); 
     goto end; 
    } 

    urlForAuthentication = [[NSString alloc] initWithCString:(const char *)"https://yahoo.com" encoding:NSUTF8StringEncoding]; 
    [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlForAuthentication]]]; 
    window.contentView = webView; 
    window.delegate = (id)webView; 
    [window makeFirstResponder:webView]; 
    [window makeKeyAndOrderFront:nil]; 
    [window makeMainWindow]; 

    if (!window.keyWindow) 
     printf("not keyWindow\n"); // this message always appears 
    if (!window.mainWindow) 
     printf("not mainWindow\n"); // this message always appears 
    [NSApp run]; 

end: 
    [urlForAuthentication release]; 
    [webView release]; 
    [window release]; 
    [NSApp release]; 
    return 0; 
} 

Make-Datei:

CC=clang 

FRAMEWORKS:=/System/Library/Frameworks/WebKit.framework/WebKit /System/Library/Frameworks/AppKit.framework/AppKit 
LIBRARIES:= 
WARNINGS=-Wall -Werror 

SOURCE=app.m 

CFLAGS=-g -v $(WARNINGS) $(SOURCE) 
LDFLAGS=$(LIBRARIES) $(FRAMEWORKS) $(LINK_WITH) 
OUT=-o app 

all: 
    $(CC) $(CFLAGS) $(LDFLAGS) $(OUT) 

Was mache ich falsch? Ich habe Dokumentation gelesen und auf SO nach ähnlichen Fragen gesucht, aber ich konnte die Lösung nicht finden. Ich habe versucht, das keyDown-Ereignis zu erfassen, aber es passiert nicht. Ich habe versucht, meinen Fensterschlüssel und Main zu machen, aber scheinbar erfolglos.

+0

Hallo und willkommen zu stackoverflow. Warum sollten Sie keine einfache AppKit-XCode-Vorlage verwenden? Es könnte viel einfacher sein, nur eine Webansicht zu implementieren. – Astoria

+0

Ja, @Astoria, natürlich hast du recht, aber bei diesem kleinen Programm würde ich lieber keinen großen monstösen XCode verwenden! Um ehrlich zu sein, mag ich diese IDE nicht. –

+0

@Astoria Spaß Tatsache: dieser Code tatsächlich woks direkt nach dem Einfügen in XCode Vorlage und Löschen von Zeilen, die 'Release' Nachrichten senden. Danke für einen Tipp, ich werde es ein wenig tiefer graben! –

Antwort

0

Wen es betrifft: Legen Sie Ihre ausführbare Datei 'abc' im Ordner 'abc.app/Contents/MacOS/', und es wird endlich richtig funktionieren!