提前感谢您的帮助。我尝试提高Objective-c的学习曲线,并在很多情况下挑战自己。 我尝试做一个简单的应用程序,模拟终端会话的组合: 第一步:提示正在等待,我输入第一个命令:例如。日期。然后我得到了一个结果。第二:提示再次低于结果。然后我给出第二个命令:时间 等
我使用UItextField进行了大量测试以输入不同的文本和命令,并使用UITextView来显示结果。我还使用NSMutable Array来存储所有输入/结果。没有什么工作得很好。我想就此问题得到你的建议,并指出我学习重现终端gui的最佳方法或代码来源。数组是一个很好的解决方案,如何将textField放在textView的末尾等等?感谢+
答案 0 :(得分:2)
这只是您想要实现的一般方法。
使用单个UITextView
进行输入和输出。
首先,在UITextView
添加一个简单的字符,例如“>”,这样用户就可以在此字符后面开始输入。
实现此UITextView委托方法,以便在用户点击“return”时收听:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if([text isEqualToString:@"\n"]) {
// Handle what happens when user presses return
return NO;
}
return YES;
}
我在这里要做的是当用户按下return时,获取整个UITextField
的内容,并使用NSArray *stringArray = [_textField.text componentsSeparatedByString: @">"];
之类的内容。这样,数组的最后一个元素就是用户输入的最后一个命令。然后,测试该命令并将适当的答案附加到UITextView
。别忘了添加@“\ n>”在它之后,你提示用户一个新的命令行。
此处剩下的工作是阻止用户删除“>”。
这是一个想法,可能有很多其他方法可以做到这一点。如果您需要更多有关某事的详细信息,请发表评论!
SPOILER ALERT:完整代码
在我的故事板中,我只有UITextView
链接到ViewController.h,名称为textView
。请注意,以下代码不处理用户从UITextView
删除文本。您可以通过在控制台中键入“hello”来测试代码。
ViewController.m:
#import "ViewController.h"
@interface ViewController () {
// Store supported commands and outputs
NSDictionary *commands;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Initialize textView
_textView.text = @">";
[_textView becomeFirstResponder];
// Init supported commands with associated output
commands = [NSDictionary dictionaryWithObjectsAndKeys:@"Hello World !", @"hello", nil];
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
// Deleting something
if([text isEqualToString:@""]) {
UITextPosition *beginning = textView.beginningOfDocument;
UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
UITextPosition *end = [textView positionFromPosition:start offset:range.length];
UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
NSString *textToReplace = [textView textInRange:textRange];
NSLog(@"%@", textToReplace);
if ([textToReplace isEqualToString:@">"]) return NO;
return YES;
}
if([text isEqualToString:@"\n"]) {
// Handle what happens when user presses return
NSArray *stringArray = [_textView.text componentsSeparatedByString: @">"];
NSLog(@"Last command : %@", [stringArray lastObject]);
[self handleCommand:[stringArray lastObject]];
return NO;
}
return YES;
}
-(void)handleCommand:(NSString*)command {
NSString *output = [commands objectForKey:command];
// If an unsupported command was typed
if (output == nil) {
output = @"Unknown command";
}
// Write output to the textView
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:output];
_textView.text = [_textView.text stringByAppendingString:@"\n>"];
}
这是来自模拟器的textView内容:
>hello
Hello World !
>yes
Unknown command
>
Unknown command
>hello
Hello World !
答案 1 :(得分:0)
许多方法都可以做到这一点。如果我这样做,我想我会做以下事情:
你必须写下以下内容: