如何在 Objective-C 中读取键盘输入

Posted

技术标签:

【中文标题】如何在 Objective-C 中读取键盘输入【英文标题】:How to read input from the keyboard in Objective-C 【发布时间】:2010-12-21 11:37:50 【问题描述】:

您好,我正在制作一个从键盘获取输入的程序,我想知道是否有任何方法可以从键盘获取输入并将其存储在 NSString 对象中。

【问题讨论】:

什么样的程序?大概不是传统的 GUI,因为字段处理自己的输入。控制台应用程序?或者带有工具键盘快捷键的东西,比如 Photoshop?游戏? 【参考方案1】:

如果您是作为命令行应用程序执行此操作,那么这是我上周编写的代码,用于从命令提示符获取一行(我将其设为 NSString 类别):

+ (NSString *) stringFromStandardInDelimitedByCharactersInSet:(NSCharacterSet *)delimiters 
 NSMutableString * string = [NSMutableString string];
 unichar input = '\0';
 while (input = getchar()) 
  if ([delimiters characterIsMember:input])  break; 
  [string appendFormat:@"%C", input];
 
 return string;

然后我会这样使用它:

NSString * input = [NSString stringFromStandardInDelimitedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

它不能很好地处理 unicode 字符(尽管使用了 unichar),因为 getchar() 只返回一个常规字符。但是,对于基本的命令行文本输入,它工作得很好。但是,请注意,这将阻塞执行它的线程(因为 getchar() 是一个阻塞调用)。

【讨论】:

为什么objective-c没有像scans in c这样的原生语句?【参考方案2】:
- (id)init 
    if( !(self = [super init]) )
        return nil;
    
    void (^monitorHandler)(NSEvent *);
    monitorHandler = ^(NSEvent *theEvent)
        switch ([theEvent keyCode]) 
            case 123:    // Left arrow
                NSLog(@"Left behind.");
                break;
            case 124:    // Right arrow
                NSLog(@"Right as always!");
                break;
            case 125:    // Down arrow
                NSLog(@"Downward is Heavenward");
                break;
            case 126:    // Up arrow
                NSLog(@"Up, up, and away!");
                break;
            default:
                break;
        
    ;
    // Creates an object we do not own, but must keep track
    // of so that it can be "removed" when we're done 
    [NSEvent addGlobalMonitorForEventsMatchingMask:(NSKeyDownMask) handler:monitorHandler];
    return self;

【讨论】:

【参考方案3】:

为什么不这样?

NSFileHandle *kbd = [NSFileHandle fileHandleWithStandardInput];
NSData *inputData = [kbd availableData];
NSString *option = [[NSString alloc] initWithData:inputData encoding:NSUTF8StringEncoding];

【讨论】:

以上是关于如何在 Objective-C 中读取键盘输入的主要内容,如果未能解决你的问题,请参考以下文章

如何在不参考 NSEvent 的情况下在 Objective-C 中获取键盘状态

在 UITextField 键盘中启用“返回按钮”(objective-c/iphone)

如何使用C从键盘读取字符串?

在Shell脚本中,读取键盘输入的内容并将其赋值给Shell变量的命令是啥?

使用html的input标签时如何控制ios键盘

C++非阻塞键盘缓冲区输入检测或读取函数是啥?