Есть ли текстовый синтаксис подстановки для строк в интерфейсе 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, даже если вы можете поддерживать только один язык.

Другие вопросы по тегам