2013-01-12 4 views
1

오케이 그래서 기본적으로 스크립트 GUI를위한 앱을 만들려고합니다. 제대로 작동하지 않는 부분은 처음에는 스크립트 출력을 표시합니다. 작업이 끝난 후에도 모든 것이 나에게 좋지 않다고 말하는 것은 불필요합니다. 지금 내가 어디 있는지는 uitextview에서 실시간으로 출력을 얻을 수 있지만 새로운 정보가 랩을 통해 전달되면 읽을 수 없게 만드는 대신 필자는 스크립트에서 apt-get update를 사용합니다. 내 코드는 다음입니다 ... 내 유일한 문제는 출력 나는 새로운 탈옥 dev에 오전 그래 난 내 응용 프로그램은 루트 권한으로 실행 한 :nstask 오류로 인한 출력 표시

#import "RootViewController.h" 

@implementation RootViewController 
@synthesize navItem; 
- (void)loadView { 
    self.view = [[[UIView alloc] initWithFrame:  [[UIScreen mainScreen] applicationFrame]]  autorelease]; 
    self.view.backgroundColor = [UIColor  redColor]; 

    navBar = [[UINavigationBar alloc] init]; 
    navBar.frame = CGRectMake(0, 0,   self.view.frame.size.width, 44); 

    navItem = [[[UINavigationItem alloc] 
    initWithTitle:@"GUI"] autorelease]; 
    navBar.barStyle = UIBarStyleDefault; 
    navBar.items = [NSArray  arrayWithObject:navItem]; 
    [self.view addSubview:navBar]; 

    NSPipe *pipe = [NSPipe pipe]; 

    _fileHandle = [pipe fileHandleForReading]; 
    [_fileHandle readInBackgroundAndNotify]; 

    task = [[NSTask alloc] init]; 
    [task setLaunchPath:@"/usr/bin/apt-get"]; 
    [task setStandardOutput: pipe]; 
    [task setStandardError: pipe]; 

     NSArray *arguments; 
    arguments = [NSArray arrayWithObjects:  @"update", nil]; 
    [task setArguments: arguments]; 

    [task launch]; 

} 
-(id)init 
{ 
    [super init]; 
    [[NSNotificationCenter defaultCenter]  addObserver:self 
    selector:@selector(readPipe:) 
     name:NSFileHandleReadCompletionNotification 
    object:nil]; 
    return self; 
} 

-(void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter]  removeObserver:self]; 
} 

-(void)readPipe: (NSNotification *)notification 
{ 
    NSData *data; 
    NSString *text; 

    if([notification object] != _fileHandle) 
     return; 

    data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem]; 
    text = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 


    navItem.title = text; 

    titleTextField = [[UITextView alloc] initWithFrame: CGRectMake(0, 40, 320, 350)]; 
    [titleTextField setBackgroundColor:[UIColor  clearColor]]; 
    titleTextField.text = text; 
    titleTextField.editable = YES; 
    titleTextField.scrollEnabled = YES; 
    titleTextField.autoresizingMask =UIViewAutoresizingFlexibleHeight; 
    [self.view addSubview: titleTextField]; 

    [text release]; 
    if(task) 
    [_fileHandle readInBackgroundAndNotify]; 

} 

@end 
+0

줄에 중단 점을 넣습니다. "data = [[notification userInfo] objectForKey : NSFileHandleNotificationDataItem];" . 디버거도 거기에 발을 내딛습니까? –

답변

0

readPipe이 작업에서 새로운 출력으로 호출 될 때마다, 당신 동일한 프레임 사각형으로 새 UITextView을 작성하십시오. 이것이 새 텍스트가 이전에 표시된 텍스트와 겹치는 이유입니다.

당신은 단일 UITextView 항상 readPipe 새로운 텍스트를 추가 사용하거나 각 텍스트는 다른 프레임을 볼 작성해야 하나.

+0

그리고 메인 스레드에서만 UITextView를 사용하여 mucking해야합니다. – bbum

+1

@bbum :'readInBackgroundAndNotify'에 대한 문서는 "... 현재 스레드에서 NSFileHandleReadCompletionNotification 알림을 게시합니다 ..."- "현재 스레드"가'readInBackgroundAndNotify'가 시작된 스레드를 의미하는 경우 알림은 주 스레드에 다시 있어야합니다. –

+0

예 - 설명해 주셔서 감사합니다. – bbum