类似终端的应用程序:UItextFied vs UITextView

时间:2014-02-12 16:08:08

标签: ios console uitextfield uitextview

提前感谢您的帮助。我尝试提高Objective-c的学习曲线,并在很多情况下挑战自己。 我尝试做一个简单的应用程序,模拟终端会话的组合: 第一步:提示正在等待,我输入第一个命令:例如。日期。然后我得到了一个结果。第二:提示再次低于结果。然后我给出第二个命令:时间 等

我使用UItextField进行了大量测试以输入不同的文本和命令,并使用UITextView来显示结果。我还使用NSMutable Array来存储所有输入/结果。没有什么工作得很好。我想就此问题得到你的建议,并指出我学习重现终端gui的最佳方法或代码来源。数组是一个很好的解决方案,如何将textField放在textView的末尾等等?感谢+

2 个答案:

答案 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)

许多方法都可以做到这一点。如果我这样做,我想我会做以下事情:

  1. 用于保存每个命令的输入和输出的字典
  2. 非常大的UITextView,字典中的所有条目都以您喜欢的格式输出
  3. 没有边框UITextField作为提示。
  4. 你必须写下以下内容:

    1. 将UITextFiled置于UITextField右侧的方法
    2. 填充Diciotnary的方法
    3. 从字典中填充UITextField的方法