ターミナルのようなアプリを作成system()
していて、コードで使用しています。その出力をテキストビューに入れたいと思います。Xcodeのボックスにその出力の一部を見ることができますがNSLog()
、これを理解することはできません。それがグーグルにあるなら、私はそれを見つけることができませんでした。
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