К сожалению, IBDesignables
невозможно использовать со статическими библиотеками (или статическими фреймворками).
Это не лучший ответ, но я хочу объяснить, почему.
Похоже, что способ, которым Interface Builder загружает классы, которые будут отображаться как конструктивные, состоит в том, что фактически динамически загружает динамическую структуру, которую вы создаете (а не двоичный файл вашего приложения), и используя классы напрямую (после их изменения с помощью время выполнения Objective-C совсем немного).
Вы можете видеть, что Interface Builder не загружает ваше приложение, а загружает только отдельные фреймворки, выполнив следующие действия:
- Создайте новый проект Xcode
- Создайте новую цель фреймворка в проекте
- Добавьте класс
IBDesignable
- В раскадровке вашего приложения создайте представление и установите его класс равным
IBDesignable
классу вашего фреймворка.
- Нажмите «Обновить все представления» в меню «Редактор».
- В папке DerivedData для проекта в каталоге
IBDesignables
вы можете видеть, что создана только цель вашей платформы.
Конструктор интерфейсов фактически загружает ваш фреймворк, используя dlopen
вручную. Вы также можете видеть, что для облегчения этого при создании вашей структуры Interface Builder фактически добавляет 2 RPATH
в ваш двоичный файл, поэтому зависимости можно найти в настраиваемых путях (вы можете просмотреть это с помощью otool -L frameworkbinary
). Этот метод загрузки вашего двоичного файла невозможен со статическими библиотеками.
Как бы то ни было, я считаю, что лучшим обходным путем для этого является создание динамических фреймворков вместо статических библиотек, но только для IBDesignable
сборок. Для этого вам придется проделать некоторую работу по настройке, и нелегко обойти Xcode, чтобы выполнить эту работу, но если вы попробуете это, вы можете использовать либо путь сборки, либо среду, чтобы различать IBDesignable
сборки. против "обычных" сборок.
person
Keith Smiley
schedule
24.06.2017