Есть ли текстовый синтаксис подстановки для строк в интерфейсе Xcode Builder интерфейса?
У меня есть программа Objective C++, используемая для настройки различных наших приложений. Есть ли способ использовать определения препроцессора для создания текста для замены в строках, используемых NSTextFieldCell, NSButtonCell?
Например, вместо NSTextField с надписью "Параметры для настройки Foo", будет макрос макропроцессора (GCC_PREPROCESSOR_DEFINITIONS):
MY_PROGRAM_NAME=Bar
и тогда текст для NSTextField будет:
"Options for setting up $(MY_PROGRAM_NAME)"
Который затем будет иметь желаемый результат: "Параметры для настройки бара"
ПРИМЕЧАНИЕ 1: очевидно, я мог бы сделать замену программно в коде.
Примечание 2: это для Xcode 7, так что, возможно, такой функции нет?
2 ответа
Одним словом, нет. Компилятор пера Xcode не выполняет никакой подстановки переменных и - после кодирования - все значения заархивированных свойств являются статическими.
Однако, если это "вещь" для вашего приложения, и не слишком много задействованных классов представления (скажем, просто NSTextField), было бы нетрудно накатить ваше собственное решение.
Я хотел бы рассмотреть этот подход:
- Придумайте простой для замены синтаксис, такой как "Некоторая строка {VAR_NAME}".
- Определите ваши переменные как пары ключ / значение в словаре. Сохраните словарь как файл XML / словарь в комплекте приложения.
- При запуске приложения загрузите словарь и сделайте его общедоступным, поместив его в глобальную переменную или добавив его в
-[NSUserDefaults registerDefaults:]
- Подкласс
NSTextField
(В качестве примера). Переопределить либо-initWithCoder:
или же-awakeFromNib
, В переопределении получите строковое значение объекта представления, отсканируйте его для подстановок, используя словарь открытых переменных, и обновите свойство строки соответствующим образом. - В IB измените класс любого NSTextField, которому требуется эта функция, на ваш пользовательский подкласс.
Другим возможным подходом было бы иметь несколько целей в вашем проекте и отдельный файл Localizable.strings для каждого из них. Это, конечно, предполагает, что вы используете Localizable.strings, даже если вы можете поддерживать только один язык.