Статическая библиотека, пакет и IB Designable

Я пытаюсь использовать IB Designable и IB Inspectable в моем UIButton, но, похоже, есть некоторые ошибки.

В навигаторе проблем файл пакета:

Раскадровка: IB Designables: не удалось обновить статус автоматического макета: не удалось загрузить designabled из пути (null)

Поэтому мне интересно, есть ли какие-либо конфигурации, которые нужно сделать, чтобы использовать его в статической библиотеке или что-то в этом роде?

Это

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface CustomUIButton : UIButton

@property (nonatomic) IBInspectable int cornerRadius;

@end

Моя настраиваемая кнопка, которую я хочу визуализировать в реальном времени, находится внутри контроллера представления


person Community    schedule 28.11.2014    source источник


Ответы (2)


К сожалению, IBDesignables невозможно использовать со статическими библиотеками (или статическими фреймворками).

Это не лучший ответ, но я хочу объяснить, почему.

Похоже, что способ, которым Interface Builder загружает классы, которые будут отображаться как конструктивные, состоит в том, что фактически динамически загружает динамическую структуру, которую вы создаете (а не двоичный файл вашего приложения), и используя классы напрямую (после их изменения с помощью время выполнения Objective-C совсем немного).

Вы можете видеть, что Interface Builder не загружает ваше приложение, а загружает только отдельные фреймворки, выполнив следующие действия:

  1. Создайте новый проект Xcode
  2. Создайте новую цель фреймворка в проекте
  3. Добавьте класс IBDesignable
  4. В раскадровке вашего приложения создайте представление и установите его класс равным IBDesignable классу вашего фреймворка.
  5. Нажмите «Обновить все представления» в меню «Редактор».
  6. В папке DerivedData для проекта в каталоге IBDesignables вы можете видеть, что создана только цель вашей платформы.

Конструктор интерфейсов фактически загружает ваш фреймворк, используя dlopen вручную. Вы также можете видеть, что для облегчения этого при создании вашей структуры Interface Builder фактически добавляет 2 RPATH в ваш двоичный файл, поэтому зависимости можно найти в настраиваемых путях (вы можете просмотреть это с помощью otool -L frameworkbinary). Этот метод загрузки вашего двоичного файла невозможен со статическими библиотеками.

Как бы то ни было, я считаю, что лучшим обходным путем для этого является создание динамических фреймворков вместо статических библиотек, но только для IBDesignable сборок. Для этого вам придется проделать некоторую работу по настройке, и нелегко обойти Xcode, чтобы выполнить эту работу, но если вы попробуете это, вы можете использовать либо путь сборки, либо среду, чтобы различать IBDesignable сборки. против "обычных" сборок.

person Keith Smiley    schedule 24.06.2017
comment
Как бы вы сделали отдельные конфигурации для нормальной и IBDesignable сборки? Я хотел бы использовать IBDesignable элементы пользовательского интерфейса, но не могу переключиться на динамические библиотеки. - person Coli88; 04.01.2018
comment
Вы можете сделать это, переопределив недокументированный параметр сборки LD, который заменяет исполняемый файл ld по умолчанию, и изменив настройки на основе каталога сборки, который включает IBDesginables только для этих сборок. См. github.com/keith/swift-staticlibs для примера использования этой настройки сборки и анализ аргументов, переданных ld. - person Keith Smiley; 21.01.2018

РЕДАКТИРОВАТЬ: IB Designable и IB Inspectable, похоже, не работают со статическими библиотеками, поэтому, если вы используете статическую библиотеку, подумайте об использовании динамической структуры (только для iOS 8) или переместите свой компонент за пределы статической библиотеки, если это возможно.

Для проблем, связанных с Cocoapods, используйте следующее решение:

Это связано с этим вопросом .

Вот решение:

1) Установите Cocoapods (0.36.0.beta.1) или новее;

2) Добавьте use_frameworks! в свой Podfile

Дополнительную информацию см. здесь.

person Edgar    schedule 23.01.2015
comment
Он не уточнил, что использует CocoaPods. Эта проблема, по-видимому, влияет на IB_DESIGNABLES, которые находятся в статической библиотеке и используются в раскадровках или xib из другого проекта. Использование use_frameworks! Директива, похоже, сообщает CocoaPods об импорте фреймворков вместо статических библиотек. - person Alex Salom; 27.01.2015