Переопределение изображений в раскадровке в рамках

У меня есть структура, которая содержит раскадровку и набор изображений по умолчанию. Рамка может быть включена в несколько приложений, и намерение заключается в том, что приложения могут переопределять ни один, некоторые или все изображения по умолчанию со своими вариантами, если это необходимо.

Проблема, с которой я столкнулась, заключается в том, что я не нашел решение, которое работает для всех сценариев, например: если в фреймворке есть образ под названием 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:").