Как читать ввод с клавиатуры в Objective-C - PullRequest
2 голосов
/ 30 ноября 2009

Здравствуйте, я делаю программу, которая получает ввод с клавиатуры, и мне было интересно, есть ли способ получить ввод с клавиатуры и сохранить его в объекте NSString.

Ответы [ 3 ]

6 голосов
/ 30 ноября 2009

Если вы делаете это как приложение командной строки, то вот код, который я написал на прошлой неделе, чтобы получить строку из командной строки (я сделал ее категорией 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]];

Он не очень хорошо обрабатывает символы юникода (несмотря на использование unichar), потому что getchar () возвращает только обычный символ. Тем не менее, для основного ввода текста в командной строке, он работает довольно хорошо Однако следует помнить, что это заблокирует поток, в котором он выполняется (поскольку getchar () является блокирующим вызовом).

3 голосов
/ 06 апреля 2012
- (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;
}
1 голос
/ 07 февраля 2014

Почему не это?

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