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