Cocoa WebView 不响应键盘事件
Cocoa WebView doesn't respond to keyboard events
我在纯 Objective-C 中制作超级简单的单页浏览器,除了键盘事件外一切正常。我只是无法使用键盘在网络表单中输入任何数据!在网络表单中粘贴和点击链接等鼠标操作有效,但在网络表单中键入无效!
代码:
#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;
}
生成文件:
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)
我做错了什么?我已经阅读了文档并在 SO 上搜索了类似的问题,但我找不到解决方案。我试图捕获 keyDown 事件,但它没有发生。我尝试制作我的 window key 和 main,但似乎没有成功。
可能关心的人:将您的可执行文件'abc'放在文件夹'abc.app/Contents/MacOS/'中,它终于可以正常工作了!
编辑: 我的同事发现这个简单的措施会影响 NSApplicationActivationPolicy。使用此路径,应用程序的 activationPolicy 为 0 (NSApplicationActivationPolicyRegular)。没有这个路径,app的activationPolicy是2(NSApplicationActivationPolicyProhibited)。
具有某些名称的二进制文件应放在“.app”文件夹中,该文件夹还应包含“Contents”文件夹。这样您的可执行文件就可以伪装成 macOS 的捆绑应用程序。
我在纯 Objective-C 中制作超级简单的单页浏览器,除了键盘事件外一切正常。我只是无法使用键盘在网络表单中输入任何数据!在网络表单中粘贴和点击链接等鼠标操作有效,但在网络表单中键入无效!
代码:
#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;
}
生成文件:
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)
我做错了什么?我已经阅读了文档并在 SO 上搜索了类似的问题,但我找不到解决方案。我试图捕获 keyDown 事件,但它没有发生。我尝试制作我的 window key 和 main,但似乎没有成功。
可能关心的人:将您的可执行文件'abc'放在文件夹'abc.app/Contents/MacOS/'中,它终于可以正常工作了!
编辑: 我的同事发现这个简单的措施会影响 NSApplicationActivationPolicy。使用此路径,应用程序的 activationPolicy 为 0 (NSApplicationActivationPolicyRegular)。没有这个路径,app的activationPolicy是2(NSApplicationActivationPolicyProhibited)。
具有某些名称的二进制文件应放在“