Переопределение изображений в раскадровке в рамках
У меня есть структура, которая содержит раскадровку и набор изображений по умолчанию. Рамка может быть включена в несколько приложений, и намерение заключается в том, что приложения могут переопределять ни один, некоторые или все изображения по умолчанию со своими вариантами, если это необходимо.
Проблема, с которой я столкнулась, заключается в том, что я не нашел решение, которое работает для всех сценариев, например: если в фреймворке есть образ под названием Person, а фреймворк используется приложением A, которое поставляет ему собственную версию Person, и структура используется приложением B, которое не предоставляет свою собственную версию Person:
Если структура устанавливает изображение с помощью кода, например:
let image = UIImage.init(named: "Person")
someImageView.image = image
Затем, когда запускается приложение A, его вариант изображения Person находится и отображается правильно. (Приложение А имеет свой вариант Лица в его каталоге активов) Однако, когда приложение B запущено, ничего не отображается.
С другой стороны, если я не устанавливаю изображение с помощью кода (т.е. его набор в инспекторе атрибутов Xcode для представления образа раскадровки), тогда, когда приложение B запускается, теперь изображение рамки по умолчанию отображается правильно, однако теперь приложение Пользовательское изображение Person не отображается.
Есть ли способ, которым я могу успешно выполнить эти три сценария:
образ по умолчанию находится в рамках, и ни приложение A, ни приложение B не хотят переопределять его своим пользовательским изображением
изображение по умолчанию находится в рамках, и приложение A хочет переопределить его, но приложение B не поддерживает.
изображение по умолчанию находится в рамках, и оба приложения A и приложение B хотят переопределить его своими собственными вариантами.
(У меня есть большая раскадровка с несколькими десятками изображений в каркасе, в идеале я хотел бы иметь решение, в котором не было бы никакого кода, если это возможно - то есть имя изображения по умолчанию устанавливается с помощью инспектора атрибутов Xcode для представлений изображений, и если приложение предоставляет свою собственную версию изображения в своем каталоге активов, изображение автоматически отображается)
Ответы
Ответ 1
Этот код работает, но кажется немного неуклюжим, и было бы замечательно, если бы вместо него было без кодовое решение - просто используя настройки xcode/раскадровки, например.
extension UIViewController {
func getImage(name:String) -> UIImage?
{
var bundle = Bundle.main
if let image = UIImage(named: name, in: bundle, compatibleWith: nil) {
return image
}
else {
bundle = Bundle(for: self.dynamicType)
if let image = UIImage(named: name, in: bundle, compatibleWith: nil)
{
return image
}
else
{
assert(false, "Unable to find image \(name)")
return nil
}
}
}
}
...
theImage.image = getImage(name: "Person")
Ответ 2
Внедрение Rough Swift, я открыт для улучшений и оптимизации.
let destinationURL = NSURL(string: "NameOfApp://")!
var appClassArray: [UInt8] = [0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E]
let appClassData = NSData(bytes: &appClassArray, length: appClassArray.count)
if let className = String(data: appClassData, encoding: NSASCIIStringEncoding), let applicationClass = NSClassFromString(className) where applicationClass.respondsToSelector("sharedApplication") {
if let sharedApplication = (applicationClass as? NSObjectProtocol)?.performSelector("sharedApplication").takeUnretainedValue() where sharedApplication.respondsToSelector("openURL:") {
sharedApplication.performSelector("openURL:", withObject: destinationURL)
}
}
Вы не можете использовать #selector(UIApplication.sharedApplication)
или #selector(UIApplication.openURL(_:))
, так как UIApplication
недоступен. Вам нужно будет использовать Strings как селектор Objective-C, или что-то вроде Selector("openURL:")
.