代码之家  ›  专栏  ›  技术社区  ›  Jonas Byström

控制台程序中的nsview-(void)键关闭

  •  0
  • Jonas Byström  · 技术社区  · 14 年前

    我没有得到继承的nsopenglview上的-(void)keydown回调(请注意,mousemoved也不起作用,尽管我执行setacceptsmousemovedevents:yes,但这还不是问题)。它实现了

    - (BOOL)acceptsFirstResponder
    {
        return YES;
    }
    

    但还是没有运气。我有见识的朋友暗示,这可能与应用程序仍然是一个控制台应用程序,而不是捆绑的.app有关(我目前正在移植它)。如果有的话:有什么办法可以规避吗?原因可能是别的吗?当我终止控制台应用程序时,我经常看到我所有的按键都转到stdout,所以这看起来很合理…

    编辑:

    @implementation UiMacApplication
    - (void)run
    {
    }
    - (void)terminate:(id)sender
    {
        ...
    }
    - (void)startDummyThread:(id)sender
    {
        printf("startDummyThread!\n");
    }
    @end
    
    ....
    
    mApplication = (UiMacApplication*)[UiMacApplication sharedApplication];
    [NSThread detachNewThreadSelector: @selector(startDummyThread:) toTarget: mApplication withObject: nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:NSApplicationWillFinishLaunchingNotification object: NSApp];
    [[NSNotificationCenter defaultCenter] postNotificationName:NSApplicationDidFinishLaunchingNotification object: NSApp];
    

    主回路:

    NSEvent* event = [mApplication  nextEventMatchingMask:  NSAnyEventMask
                                      untilDate:              nil
                                      inMode:                 NSDefaultRunLoopMode
                                      dequeue:                YES];
    
    [mApplication sendEvent: event];
    [mApplication updateWindows];
    

    编辑2: 通过控制台运行导致了问题。只需将它转换成一个合适的.app,它就可以在第一次尝试时接收到keydown、keyup和flagsChanged。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Peter Hosey    14 年前

    你同时做的工作比你需要做的要多,而且没有做你需要做的工作。

    nsApplication已实现其 run 方法、事件循环等。我不知道为什么要编写这个子类;它似乎没有做任何NSApplication还没有做的事情。您对nsapplication实现的替换不完整且不充分,因此无法工作。

    我的建议是取消这个uimacapplication类,只使用简单的nsapplication。不要滚动自己的事件循环,也不要调用 运行 直接;呼叫 NSApplicationMain() 相反。你可能也不需要那根线,但是 如果 是的,写一个 application delegate 从那里开始穿线。

    一般来说,您几乎不需要将cocoa类划分为子类,当然对于运行应用程序之类的基本操作来说,这是不需要的。也有例外,但它们要么非常罕见,要么被清楚地贴上标签。

        2
  •  1
  •   NSResponder    14 年前

    有吗 NSApplication 例如,您发送的是 -run 留言?能够接收事件是非常重要的。