将system()的输出放入文本视图中

时间:2013-02-06 03:31:21

标签: ios objective-c

我正在创建一个类似终端的应用,并在我的代码中使用system()。我想把它的输出放到文本视图中。我可以在Xcode的NSLog()框中看到它的一些输出,但我无法弄清楚这个。如果它出现在Google上,我找不到它。

1 个答案:

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