【问题标题】:NSDatePicker action method not firingNSDatePicker 操作方法未触发
【发布时间】:2012-05-14 20:20:31
【问题描述】:

场景:

用户正在以文本形式在NSDatePicker 中输入日期,没有步进器(在 OS X 上),当他们在键盘上按回车键时,我希望向控制器发送一条消息。

NSTextField 中,我只需在Interface Builder 中连接动作,或者从代码中设置它,当用户点击回车时,动作消息就会发送到目标。

日期选择器允许设置动作消息和目标,但我无法触发动作。当我在日期选择器中按 Enter 键时,不会调用操作消息。

是我做错了什么,还是我必须使用一种解决方法?如果需要的话,我不会反对对所涉及的任何类进行子类化。

【问题讨论】:

    标签: macos cocoa nsdatepicker


    【解决方案1】:

    NSDatePicker 不会处理或转发由 Return 或 Enter 键触发的键事件。

    解决方案是继承 NSDatePicker 以在 keyDown 中获得所需的行为:

    #import "datePickerClass.h"
    
    @implementation datePickerClass
    - (void)keyDown:(NSEvent *)theEvent{
        unsigned short n = [theEvent keyCode];
        if (n == 36 || n == 76) {
           NSLog(@"Return key or Enter key");
            // do your action
            //
        } else { 
            [super keyDown:theEvent];// normal behavior
        }
    }
    @end
    

    就是这样。

    编辑:您也可以使用 NSCarriageReturnCharacterNSEnterCharacter

    NSString* const s = [theEvent charactersIgnoringModifiers];
    unichar const key = [s characterAtIndex:0];
    if (key == NSCarriageReturnCharacter || key == NSEnterCharacter) {
    

    【讨论】:

    • 看起来又漂亮又简单。由于 Apple 在其文档中的某处提到在诉诸 keyDown: 之前在代表、格式化程序或类似工具中搜索解决方案,我希望会有另一种解决方案,但至少这个很简单。一些谷歌搜索导致了 Events.h,其中甚至为 36 和 76 定义了官方常量。该文件中有用的 cmets 提到不能保证 Enter 键的 76 在非 ANSI 键盘上工作,所以我想我将只使用 kVK_Return 保证可以在所有键盘上工作。
    • 你也可以使用 NSCarriageReturnCharacterNSEnterCharacter,我编辑我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多