Como ler a entrada do teclado em Objective-C
-
08-07-2019 - |
Pergunta
Oi Eu estou fazendo um programa que recebe a entrada do teclado e eu queria saber se havia alguma maneira de obter a entrada do teclado e armazená-lo em um objeto NSString
.
Solução
Se você está fazendo isso como um aplicativo de linha de comando, então o código de aqui eu escrevi na semana passada para obter uma linha a partir do prompt de comando (eu fiz isso uma categoria 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;
}
E então eu usá-lo como este:
NSString * input = [NSString stringFromStandardInDelimitedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
Não lidar com caracteres Unicode muito bem (apesar de usar um UNICHAR), porque getchar () só retorna um char regular. No entanto, para a entrada de linha de comando de texto simples, ele funciona muito bem. No entanto, alertou que este irá bloquear o segmento em que ele é executado (desde getchar () é uma chamada de bloqueio).
Outras dicas
- (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;
}
Por que não isso?
NSFileHandle *kbd = [NSFileHandle fileHandleWithStandardInput];
NSData *inputData = [kbd availableData];
NSString *option = [[NSString alloc] initWithData:inputData encoding:NSUTF8StringEncoding];