1

Вопрос по shell, objective-c, cocoa, xcode – (Mac) Создание приложения Xcode, которое выполняет сценарии оболочки

Кажется, что такая простая вещь, которую я пытаюсь выполнить, гораздо меньше, чем то, на что способен Xcode / Interface Builder. Я искал и искал, но не нашел ответа, но большинство поисков привело меня сюда, поэтому я создал учетную запись, чтобы спросить экспертов. Я хочу создать очень простой графический интерфейс пользователя, который будет иметь от четырех до пяти кнопок, каждая из которых выполняет простой сценарий оболочки; окно терминала не понадобится, но я могу жить с одним запуском, если так оно и есть. Наряду со сценариями оболочки мне нужно иметь в приложении adb (Android debug bridge) и утилиту fastboot. Я предполагаю, что мне нужно поместить adb и fastboot и другие мои файлы в папку «Ресурсы», я также предполагаю, что мне нужно поместить свои скрипты оболочки в папку «Классы». Мне просто нужно знать, как соединить кнопки со сценариями, я надеюсь, что это просто что-то простое, что я упускаю из виду. Заранее спасибо.

MacBook Pro 7,1 OSX 10.6.8 Xcode 3.2.6

Error: User Rate Limit Exceeded<code>[[NSBundle mainBundle] pathForResource:@&quot;yourscript&quot; ofType:@&quot;py&quot;]</code>Error: User Rate Limit Exceeded

Apr 10, 2012, 2:03 AMот

Error: User Rate Limit Exceeded<a href="https://rads.stackoverflow.com/amzn/click/com/0321503619" rel="nofollow noreferrer">amazon.com/Cocoa-Programming-Mac-3rd-Edition/dp/0321503619</a>Error: User Rate Limit Exceeded

Apr 10, 2012, 2:19 AMот

Error: User Rate Limit Exceeded

Apr 10, 2012, 2:07 AMот

Error: User Rate Limit Exceeded

Apr 10, 2012, 2:14 AMот

Error: User Rate Limit Exceeded

Apr 10, 2012, 2:27 AMот

1ответ

8

Try this :

- (void)runCmd:(NSString *)cmd withArgs:(NSArray *)args
{
    if (task)
    {
        [task interrupt];

    }
    else
    {
        task = [[NSTask alloc] init];
        [task setLaunchPath:cmd];

        [task setArguments:args];

        [pipe release];

        pipe = [[NSPipe alloc] init];
        [task setStandardOutput:pipe];

        NSFileHandle* fh = [pipe fileHandleForReading];

        NSNotificationCenter* nc;

        nc = [NSNotificationCenter defaultCenter];
        [nc removeObserver:self];
        [nc addObserver:self 
               selector:@selector(dataReady:) 
                   name:NSFileHandleReadCompletionNotification 
                 object:fh];
        [nc addObserver:self selector:@selector(dataAvailable:) name:NSFileHandleDataAvailableNotification object:fh];
        [nc addObserver:self 
               selector:@selector(taskTerminated:) 
                   name:NSTaskDidTerminateNotification 
                 object:task];

        [task launch];
        [fh readInBackgroundAndNotify];
    }
}

- (void)dataAvailable:(NSNotification*)n
{
    NSLog(@"Data Available : %@",n);
}

- (void)dataReady:(NSNotification*)n
{
    NSData* d;

    d = [[n userInfo] valueForKey:NSFileHandleNotificationDataItem];

    if ([d length])
    {
        NSLog(@"Data Ready : %@",[[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding]);
        [[[task standardOutput] fileHandleForReading] readInBackgroundAndNotify];
    }
}

- (void) taskTerminated:(NSNotification*)note
{
    [task release];
    task = nil;
}

RelatedQuestions