Как получить доступ к цвету из каталога ресурсов в общей среде в приложении watchOS?

#watchos

#watchos

Вопрос:

У меня есть общая среда для моих приложений iOS и watchOS, которая содержит каталог ресурсов с некоторыми названными цветами. Я хотел бы получить доступ к именованным цветам в моем приложении watchOS. В iOS я могу использовать UIColor.init(named name: String, in bundle: Bundle, compatibleWith traitCollection: UITraitCollection) , чтобы указать системе доступ к имени из переданного пакета.

watchOS также утверждает, что этот инициализатор доступен с watchOS 4; однако автозаполнение Xcode не находит его, при попытке его использования я получаю ошибку сборки, и это немного странно, потому что UITraitCollection (которая является частью сигнатуры этого метода) все равно не доступна нам в watchOS.

Как я могу получить доступ к ресурсу из каталога ресурсов в моей общей среде?

Ответ №1:

Не уверен, что это лучшее решение, но я добавил свои iOS Assets.xcassets в расширение WatchApp на панели целевого членства, и это решило проблему.

Комментарии:

1. Спасибо — это, возможно, немного лучше, чем просто дублировать каждый ресурс между платформой и приложением watch вручную, но в конечном итоге это все равно дублирует ресурсы. 🙁

Ответ №2:

У меня была такая же проблема, и я отправлю отзыв / радар, но в то же время смог использовать Color объект SwiftUI, который имеет init(_ name: String, bundle: Bundle? = nil) значение моста в watchOS, и использовать UIColor(Color) конструктор для получения эквивалентного UIColor экземпляра. ie:

 UIColor(Color("myColor", bundle: myBundle))
  

В моем конкретном случае фактический код, который я использую, предоставляется через расширения в UIColor, Color и Bundle, так что я ввел доступ к каталогу активов и bundle, но это, по сути, механизм под капотом.

Ответ №3:

Это взлом, но я создал заголовок objc, чтобы сделать UITraitCollection определение доступным для watchOS. Это позволило получить доступ к UIColor(named name: String, in bundle: Bundle?, compatibleWith traitCollection: UITraitCollection?) методу.

Файл заголовка Objc добавлен в платформу:

 #if TARGET_OS_WATCH

@import UIKit;

@interface UITraitCollection : NSObject

@end

#endif