【发布时间】:2010-12-21 11:37:50
【问题描述】:
您好,我正在制作一个从键盘获取输入的程序,我想知道是否有任何方法可以从键盘获取输入并将其存储在 NSString 对象中。
【问题讨论】:
-
什么样的程序?大概不是传统的 GUI,因为字段处理自己的输入。控制台应用程序?或者带有工具键盘快捷键的东西,比如 Photoshop?游戏?
标签: objective-c textinput
您好,我正在制作一个从键盘获取输入的程序,我想知道是否有任何方法可以从键盘获取输入并将其存储在 NSString 对象中。
【问题讨论】:
标签: objective-c textinput
如果您是作为命令行应用程序执行此操作,那么这是我上周编写的代码,用于从命令提示符获取一行(我将其设为 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() 是一个阻塞调用)。
【讨论】:
- (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;
}
【讨论】:
为什么不这样?
NSFileHandle *kbd = [NSFileHandle fileHandleWithStandardInput];
NSData *inputData = [kbd availableData];
NSString *option = [[NSString alloc] initWithData:inputData encoding:NSUTF8StringEncoding];
【讨论】: