Как использовать IBDesignable/IBInspectable с CocoaPods в проекте только на Objective-C

Мой проект только Obj-C. Через Cocoapods я попытался установить библиотеку Obj-C, которая использует преимущества IBDesignable и IBInspectable. Если я добавлю этот проект в свою библиотеку и запущу 'pod install', я получу две ошибки при сборке/запуске:

error: IB Designables: Failed to update auto layout status: Failed to load designables from path (null)
error: IB Designables: Failed to render instance of PKCircleProgressView: Failed to load designables from path (null)

Итак, очевидно, чтобы воспользоваться преимуществами IBDesignable/IBInspectable, ваш код должен быть в фреймворке, а не в статической библиотеке. Кажется, все, что мне нужно сделать, это добавить это в мой подфайл:

use_frameworks!

Когда я это делаю, я могу видеть все в Interface Builder, но когда я создаю/запускаю, он не может найти AFNetworking.h. Я не думаю, что ошибка связана с AFNetworking, это просто первый модуль в моем подфайле.

Если бы я использовал Swift, похоже, что ответ заключается в том, что мне нужно добавить все библиотеки из моего подфайла в мой соединительный заголовок Swift/Obj-C.

Несмотря на то, что я не использую Swift, мне все равно нужно создавать соединительный заголовок?

Вот мой подфайл (без модуля DownloadButton и без use_frameworks!):

platform :ios, '8.0'
pod 'AFNetworking'
pod 'FMDB'
pod 'HKCircularProgressView'
#pod 'Taplytics'
pod 'PAPreferences'
pod 'HTMLLabel'
pod 'IDMPhotoBrowser'
pod 'MBProgressHUD'

link_with 'Langham', 'Leela', 'Las Alcobas', 'Siam', 'AKA BH', 'Ritz Montreal', 'Fullerton', 'Fullerton Bay'

# Fix broken copy-resources phase per https://github.com/CocoaPods/CocoaPods/issues/1546
post_install do |installer|
    installer.pods_project.targets.each do |target|
        scriptBaseName = "\"Pods/Target Support Files/#{target.name}/#{target.name}-resources\""
        sh = <<EOT
        if [ -f #{scriptBaseName}.sh ]; then
            if [ ! -f #{scriptBaseName}.sh.bak ]; then
                cp #{scriptBaseName}.sh #{scriptBaseName}.sh.bak;
            fi;
            sed '/WRAPPER_EXTENSION/,/fi\\n/d' #{scriptBaseName}.sh > #{scriptBaseName}.sh.temp;
            sed '/*.xcassets)/,/;;/d' #{scriptBaseName}.sh.temp > #{scriptBaseName}.sh;
            rm #{scriptBaseName}.sh.temp;
        fi;
EOT
        `#{sh}`
    end
end

person djibouti33    schedule 07.08.2015    source источник
comment
Нет, bridging-header предоставляет Obj-C интерфейсы Swift, а не наоборот.   -  person SwiftArchitect    schedule 09.08.2015
comment
Можете ли вы опубликовать весь свой подфайл для проверки?   -  person SwiftArchitect    schedule 09.08.2015
comment
@SwiftArchitect - я только что опубликовал свой подфайл.   -  person djibouti33    schedule 09.08.2015


Ответы (1)


Исправление

IBInspectable и IB_DESIGNABLE не связаны с Swift. Их можно использовать как в Swift, так и в Objective-C. Это зависит от версии iOS, а иногда и от установки Module в IB.

Пример из реальной жизни

iOS 7 не поддерживает IBInspectable, поэтому используйте класс .7 для обоих элементов управления. Если ваш проект нацелен на iOS 8+, вам следует использовать вместо этого TGPDiscreteSlider и TGPCamellLabels.

Создайте базовый класс для iOS 7 (до IBInspectable)

@interface TGPCamelLabels7 : UIControl...

@property (nonatomic, assign) CGFloat ticksDistance;
@property (nonatomic, assign) NSUInteger value;
// ...

Создайте дочерний класс для iOS 8

@interface TGPCamelLabels : TGPCamelLabels7

@property (nonatomic) IBInspectable CGFloat ticksDistance;
@property (nonatomic) IBInspectable NSUInteger value;
// ...

Таким образом, ваш Pod можно использовать в любом режиме. Эта проблема была подробно решена в этом модуле TGPControls.

Загрузите проект, вы найдете 2 примера проектов Xcode, один для Swift, 1 для Objective-C.

person SwiftArchitect    schedule 08.08.2015
comment
Спасибо. Проблема, с которой я столкнулся после включения модуля DonwloadButton и добавления use_frameworks! в мой подфайл, заключается в том, что теперь мой проект не смог найти самый первый модуль в моем подфайле, AFNetworking. Мне непонятно, как я должен использовать use_frameworks! с существующими модулями, которые никогда не нуждались в этом объявлении. - person djibouti33; 09.08.2015
comment
Пожалуйста, разработайте: pod 'DownloadButton' не написано на Swift и не требует use_frameworks! - person SwiftArchitect; 10.08.2015
comment
Это или или?? Если я использую swift AND target c с помощью связующих заголовков, я не могу использовать IBDesignable? - person mesh; 17.03.2016
comment
Это не Obj-C и Swift, это iOS 8+ и iOS 7. - person SwiftArchitect; 19.03.2016