我正在创建一个类似终端的应用,并在我的代码中使用system()
。我想把它的输出放到文本视图中。我可以在Xcode的NSLog()
框中看到它的一些输出,但我无法弄清楚这个。如果它出现在Google上,我找不到它。
答案 0 :(得分:1)
我从blog.bignerdranch.com/1836-hijacking-for-fun-and-profit下载了源代码。然后你调用他声明的函数,我很确定你们知道怎么做。但我会告诉你我如何调用这些函数。
首先,你必须链接这些类。然后在视图中加载方法你必须启动高位。
// Hijack standard out.
self.stdoutHijacker = [XXFdHijacker hijackerWithFd: fileno(stdout)];
setbuf (stdout, NULL);
self.stdoutHijacker.delegate = self;
[self.stdoutHijacker startHijacking];
[self.stdoutHijacker startReplicating];
// Hijack standard error
self.stderrHijacker = [XXFdHijacker hijackerWithFd: fileno(stderr)];
setbuf (stderr, NULL);
self.stderrHijacker.delegate = self;
[self.stderrHijacker startHijacking];
[self.stderrHijacker startReplicating];
self.contents = [NSMutableString string];
之后,当一个人输入命令时,我有一个IBAction。 system()接受一个const char,所以我不得不将文本字段中的文本转换为const char,所以我只会向你展示system()中的一些文本
-(IBAction)doCommand:(id)sender{
system("ls"); //shows contents of root directory in my case
}
接下来,我们定义一个void来滚动到文本视图的结尾
- (void) scrollToEnd {
NSRange range = NSMakeRange (self.contents.length, 0);
[self.loggingView scrollRangeToVisible: range];
} // scrollToEnd
最后我们得到了文本
- (void) hijacker: (XXFdHijacker *) hijacker gotText: (NSString *) text {
if (hijacker == self.stdoutHijacker) [self.contents appendString: @"stdout: "];
if (hijacker == self.stderrHijacker) [self.contents appendString: @"stderr: "];
[self.contents appendString: text];
self.loggingView.text = self.contents;
[self scrollToEnd];
} // hijacker
这将导致错误和发送到NSLog的任何内容。如果您不想要错误,请删除
// Hijack standard error
self.stderrHijacker = [XXFdHijacker hijackerWithFd: fileno(stderr)];
setbuf (stderr, NULL);
self.stderrHijacker.delegate = self;
[self.stderrHijacker startHijacking];
[self.stderrHijacker startReplicating];
来自viewDidLoad的。如果您只想要数据,则擦除
// Hijack standard out.
self.stdoutHijacker = [XXFdHijacker hijackerWithFd: fileno(stdout)];
setbuf (stdout, NULL);
self.stdoutHijacker.delegate = self;
[self.stdoutHijacker startHijacking];
[self.stdoutHijacker startReplicating];
哦,还有一件事......添加你将使用代码的视图控制器的实现文件的顶部。使它看起来与我的完全相同,除了改变它将viewController视为你的视图控制器的名称< / p>
@interface XXViewController () <XXFdHijackerDelegate>
@property (weak, nonatomic) IBOutlet UITextView *loggingView;
@property (strong, nonatomic) XXFdHijacker *stdoutHijacker;
@property (strong, nonatomic) XXFdHijacker *stderrHijacker;
@property (strong, nonatomic) NSMutableString *contents;
@end // extension