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

Ios 类似终端的应用程序:UItextFied vs UITextView,ios,console,uitextfield,uitextview,Ios,Console,Uitextfield,Uitextview,提前感谢你的帮助。我试图提高我的Objective-c学习曲线,并用大量的案例来挑战自己。 我尝试做一个简单的应用程序,模拟终端会话的动作: 第一步:提示正在等待,我输入第一个命令:例如date。然后我得到一个结果。第二:结果下方再次出现提示。然后我发出第二个命令:时间 等等 我使用UItextField进行了大量测试,以输入不同的文本和命令,并使用UITextView显示结果。我还使用NSMutable数组存储所有输入/结果。没有什么能很好地工作。我想听听你对这件事的建议,你告诉我学习复制终端

提前感谢你的帮助。我试图提高我的Objective-c学习曲线,并用大量的案例来挑战自己。 我尝试做一个简单的应用程序,模拟终端会话的动作: 第一步:提示正在等待,我输入第一个命令:例如date。然后我得到一个结果。第二:结果下方再次出现提示。然后我发出第二个命令:时间 等等


我使用UItextField进行了大量测试,以输入不同的文本和命令,并使用UITextView显示结果。我还使用NSMutable数组存储所有输入/结果。没有什么能很好地工作。我想听听你对这件事的建议,你告诉我学习复制终端gui的最佳方法或代码源。数组是否是一个好的解决方案,如何将textField放置在textView的末尾,等等。?谢谢+

这只是您想要实现的一般方法

使用单个
UITextView
进行输入和输出

首先,在
UITextView
中添加一个简单字符,例如“>”,以便用户开始在该字符后键入

实现此UITextView委托方法,以便在用户点击“返回”时侦听:

我在这里要做的是,当用户按下return键时,获取整个
UITextField
的内容,并使用类似
NSArray*stringArray=[\u textField.text componentsSeparatedByString:@“>”]。这样,数组的最后一个元素就是用户输入的最后一个命令。然后,测试该命令并将适当的答案附加到
UITextView
。不要忘记在它后面添加@“\n>”,这样您就可以提示用户一个新的命令行

这里要做的是防止用户删除您的“>”

这是一个想法,可能还有很多其他的方法。如果你需要更多的细节,请发表评论


扰流板警报:完整代码

在我的故事板中,我只是有一个链接到ViewController.h的
UITextView
,名为
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 !

有很多方法可以做到这一点。如果我这样做,我想我会做以下几点:

  • 保存每个命令的输入和输出的字典
  • 非常大的UITextView,字典中的所有条目都以您喜欢的格式输出
  • 用作提示的无边框UITextField 您必须编写以下内容:

  • 将UITextField放置在UITextField右行的方法
  • 一种填充双生肖的方法
  • 从字典填充UITextField的方法

  • 同时提交。我更喜欢你的方式@objM:我为解决方案添加了完整的代码。你必须确保用户不会删除他不应该删除的内容。@r你是个聪明的火箭人!它工作得很好。现在我必须管理键盘。我想我可以接受。我只是仍然有一点挣扎,以防止删除文本。我在-(BOOL)textView方法中尝试了类似的方法:if(range.location。与退格抗争…也许是个坏主意。您的建议太好了。@objM我更新了shouldChangeTextInRange:code。如果用户试图删除某个内容,请查看它是什么。所有UITextPosition行都在这里,以获取用户要删除的内容。确保在UItextView的情节提要中关闭“可选”。如果您不这样做,用户将能够选择大部分文本,您的测试将不会将其视为@“>”。如果要保持“可选”,请替换isEqualToString:@“>”,以进行类似字符串包含@“>”这样的测试。这没问题,并且我保持“可选”打开,使用此测试:如果([textToReplace rangeOfString:@“>”)。位置-1)返回否;当“可选”关闭时,我再也看不到任何东西。帮了大忙,thks++
    >hello
    Hello World !
    >yes
    Unknown command
    >
    Unknown command
    >hello
    Hello World !