Получение возвращаемого значения AppleScript в Obj-C - PullRequest
7 голосов
/ 24 июля 2011

Я использую немного AppleScript в своем проекте Какао Obj-C для управления проигрывателем QuickTime (воспроизведение, пауза, остановка, бег вперед и назад и т. Д.) С большим успехом, хотя мои знания об AppleScript очень ограничены.Однако больше всего мне нужно, чтобы смещение фильма «Текущее время» преобразовывалось в метки времени для написания сценария субтитров.

Следующий простой метод показывает точное текущее положение в (плавающих) секундах вдиалоговое окно, но мне бы очень хотелось, чтобы AppleScript вернул мне переменную , которую я могу использовать в остальной части приложения.Как я могу изменить код ниже, чтобы сделать это?Возможно ли получить доступ к этому значению?Спасибо за миллион заранее: -)

-(IBAction)currentPlayTime:(id)sender
{
    NSString *scriptString=[NSString stringWithFormat:
        // get time of current frame... (works perfectly)!
        @"tell application \"QuickTime Player\"\n"
            @"set timeScale to 600\n"
            @"set curr_pos to current time of movie 1/timeScale\n"
            @"display dialog curr_pos\n" // ...not in a practical form to use
        @"end tell\n"];

    NSDictionary *errorDict= nil;
    NSAppleScript *appleScriptObject=[[NSAppleScript alloc] initWithSource:scriptString];
    NSAppleEventDescriptor *eventDescriptor=[appleScriptObject executeAndReturnError:   &errorDict];
    // handle any errors here (snipped for brevity)
    [appleScriptObject release]; // can I retain this?
}

Ответы [ 3 ]

17 голосов
/ 24 июля 2011

Вот соответствующий AppleScript, который вы хотите запустить:

property timeScale : 600

set currentPosition to missing value

tell application "QuickTime Player"
    set currentPosition to (current time of document 1) / timeScale
end tell

return currentPosition

Если вы с ним не знакомы, property - это способ указать глобальную переменную в AppleScript. Кроме того, missing value является AppleScript-эквивалентом nil в Objective-C. Итак, этот скрипт сначала определяет переменную с именем currentPosition и устанавливает значение missing value. Затем он входит в блок tell, который, в случае успеха, изменит переменную currentPosition. Затем, вне блока Tell, он возвращает переменную currentPosition.

В коде Objective-C, когда вы создаете NSAppleScript с вышеуказанным кодом, его метод -executeAndReturnError: вернет переменную currentPosition в NSAppleScriptEventDescriptor.

-(IBAction)currentPlayTime:(id)sender {

    NSDictionary *error = nil;

    NSMutableString *scriptText = [NSMutableString stringWithString:@"property timeScale : 600\n"];
    [scriptText appendString:@"set currentPosition to missing value\n"];
    [scriptText appendString:@"tell application \"QuickTime Player\"\n "];
    [scriptText appendString:@"set currentPosition to (current time of document 1) / timeScale\n"];
    [scriptText appendString:@"end tell\n"];
    [scriptText appendString:@"return currentPosition\n"];

    NSAppleScript *script = [[[NSAppleScript alloc] initWithSource:scriptText] autorelease];

    NSAppleEventDescriptor *result = [script executeAndReturnError:&error];

    NSLog(@"result == %@", result);

    DescType descriptorType = [result descriptorType];

    NSLog(@"descriptorType == %@", NSFileTypeForHFSTypeCode(descriptorType));

    // returns a double

    NSData *data = [result data];
    double currentPosition = 0;

    [data getBytes:&currentPosition length:[data length]];

    NSLog(@"currentPosition == %f", currentPosition);
}

Вы можете извлечь содержимое NSAppleEventDescriptor, как показано выше.

Использование инфраструктуры Scripting Bridge имеет небольшую кривую обучения, но позволит работать с нативными типами, такими как NSNumber s, вместо того, чтобы идти по более «грязному» пути извлечения сырых байтов из дескриптора AppleEvent. 1025 *

1 голос
/ 24 июля 2011

NSAppleEventDescriptor имеет несколько методов для преобразования в некоторые типы Objective-C. Если вы зайдете на мой сайт и загрузите проект NDScript, у него есть категория NSAppleEventDescriptor, которая добавляет гораздо больше методов для приведения к типу Objective-C.Вы можете использовать эту категорию без остальной части проекта.http://homepage.mac.com/nathan_day/pages/source.xml

1 голос
/ 24 июля 2011

Использование Мост сценариев . Это мост между AppleScript и Objective-C, и другие приложения (например, QuickTime Player) представлены как объект Objectve-C в вашем коде. Таким образом, вам не нужно создавать код AppleScript вручную.

Некоторые говорят, что AppScript лучше, чем Scripting Bridge.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...