我有一个包含故事板和默认图像的框架.该框架可以包含在多个应用程序中,并且意图是应用程序可以覆盖没有,一些或所有默认图像与自己的变体,如果他们需要.
我所面临的问题是,我没有找到适用于所有情况的解决方案,例如:如果框架包含一个名为Person的图像,并且该框架由App A使用,该应用程序提供自己的Person版本,并且框架被应用程序B使用,不提供自己的版本的Person然后:
如果框架使用以下代码设置图像:
let image = UIImage.init(named: "Person") someImageView.image = image
然后,当运行应用程序A时,会找到并显示Person图像的变体. (应用程序A在其资产目录中有其变体Person)但是,当应用程序B运行时不显示任何内容.
另一方面,如果我不使用代码设置图像(即它在Xcode的属性检查器中为故事板图像视图设置),那么当应用程序B运行时,现在默认框架图像正确显示,但是现在应用程序A的自定义人员图像不显示.
有没有办法可以成功地覆盖这三种情况:
默认图像在框架中,应用程序A和应用程序B都不希望使用自定义图像覆盖它
默认图像在框架中,应用程序A想覆盖它,但应用程序B不.
默认图像在框架中,应用程序A和应用程序B都要用自己的变体来覆盖它.
(我在框架中有一个大型的故事板,几十个图像,理想情况下,我希望有一个解决方案,如果可能的话,根本就不需要任何代码 – 即默认的图像名称是通过Xcode的属性检查器设置的,用于图像视图,如果应用程序在其资产目录中提供自己的图像版本,自动显示图像)
解决方法
这段代码可以工作,但似乎有点笨重,如果有一个无代码的解决方案可能会变得如此 – 只要使用xcode / storyboard设置就可以了.
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,compatibleWith: nil) { return image } else { assert(false,"Unable to find image \(name)") return nil } } } }
…
theImage.image = getImage(name: "Person")