2016-03-26 5 views
2

Это вопрос о внедрении сценария приложения с использованием Cocoa Scripting.Предоставление моих собственных объектов для «создания новых» в моем приложении для сценариев

Объект, предназначенный для сценария application, содержит элементы пользовательского класса, назовите его flower.

В файле .sdef класс Cocoa для flower указан как ScriptableFlower.

В Applescript, теперь можно написать:

tell app "myapp" 
    get flowers 
end tell 

Мой код обеспечивает функцию доступа для получения цветов: -(NSArray*)flowers.

Теперь я хотел бы реализовать способ добавления новых цветов, так что можно написать:

tell app "myapp" 
    make new flower 
end tell 

поведение по умолчанию для этого, с по умолчанию основной набор обработчика для «сделать» с помощью NSCreateCommand, является следующим образом:

скриптового движок будет получать текущий массив цветов, вызвав мою flowers функции, а затем создать экземпляр нового объекта какао класса ScriptableFlower, а затем вызвать setFlowers:(NSArray*) с массивом, который содержит мои исходные объекты плюс только что созданного ,

Однако это не подходит для моего приложения: я не могу позволить механизму сценариев создавать объекты моих скриптовых классов по своему усмотрению.

Вместо этого мне нужно создать экземпляр.

Решение на полпути было бы реализовать метод по умолчанию -(id)init, а затем определить, вызван ли он мной - если нет, я могу выполнить дополнительные шаги. Но это не чисто. Я скорее не позволяю скриптовому движку создавать новые объекты вообще, а скорее предоставлять их себе, поскольку у меня может быть уже готовый объект «где-то».

Есть ли какое-то положение в Cocoa Scripting, которое приводит к тому, что он вызывает меня всякий раз, когда он хочет, чтобы я создал новый скриптовый объект?

Update

Уточнение: Cocoa Scripting docs объясняет, что можно реализовать специальные обработчики вставки (insertObject:in<Key>AtIndex:), так что не надо брать весь NSArray, но по-прежнему приводит к скриптовый движок для создания объект. Однако мне нужно попросить создать объект.

ответ

1

Файл NSObjectScripting.h предоставляет функцию для этого:

- (id)newScriptingObjectOfClass:(Class)objectClass forValueForKey:(NSString *)key withContentsValue:(id)contentsValue properties:(NSDictionary *)properties; 

Это доступно, так как OS X 10.5 и документированный следующим образом:

Создать новый экземпляр скриптового класса, который будет вставлен в отношения, идентифицированные ключом, задают значение contentValue и его свойства и возвращают его. Или верните нуль для отказа. ContentsValue и свойства выводятся из параметров «с содержимым» и «со свойствами» команды Make. Значение contentValue может быть равно нулю.Когда этот метод вызывается Cocoa, ни contentValue, ни свойства еще не будут принудительно использованы с использованием метода -coerceValue для ключа key-value: метод forKey :. В .sdef-объявленной скриптабельности типы передаваемых объектов надежно соответствуют соответствующим объявлениям .sdef.

0

Один из вариантов заключается в подклассе NSCreateCommand и реализовать свою собственную логику.

 Смежные вопросы

  • Нет связанных вопросов^_^