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) 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];

ああ、もう1つ...コードを使用するViewControllerの実装ファイルの先頭を追加します。viewControllerと表示されている場所を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 に答える