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