0

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

4

1 回答 1

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 更改为您的视图控制器的名称

    @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
于 2013-02-07T00:02:48.597 回答