如何覆盖框架内

时间:2016-07-28 16:55:30

标签: ios frameworks storyboard

我有一个框架,其中包含一个故事板和一组默认图像。 该框架可以包含在多个应用程序中,目的是如果需要,应用程序可以覆盖任何默认图像,使用自己的变体。

我面临的问题是我找不到适用于所有情况的解决方案,例如: 如果框架包含一个名为Person的图像,并且app A使用该框架提供它自己的Person版本,那么框架由app B使用,它不提供自己版本的Person:

如果框架使用以下代码设置图像:

    let image = UIImage.init(named: "Person")
    someImageView.image = image

然后,当app A运行时,会找到并正确显示Person图像的变体。 (App A在其资产目录中有Person的变体) 但是,当应用程序B运行时,不显示任何内容。

另一方面,如果我没有使用代码设置图像(即在故事板图像视图的Xcode属性检查器中设置),那么当运行app B时,现在默认的框架图像是显示正确,但现在不会显示应用程序A的自定义个人图像。

有没有办法可以成功地涵盖这三种情况:

  1. 默认图片位于框架中,既不是app A也不是app B. 希望用自定义图像覆盖它
  2. 默认图片位于 框架和应用程序A想要覆盖它,但应用程序B没有。
  3. 默认图片在框架中,app A和app B都想要 用它们自己的变体覆盖它。
  4. (我在框架中有几十个图像的大型故事板,理想情况下我希望有一个根本不涉及代码的解决方案 - 即默认图像名称是通过Xcode的属性检查器设置的对于图像视图,如果应用程序在其资产目录中提供自己的图像版本,则会自动显示图像

1 个答案:

答案 0 :(得分:0)

这段代码有效,但看起来有点笨拙,如果有一个无代码解决方案可能会很棒 - 例如,只使用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, in: bundle, compatibleWith: nil)
            {
                return image
            }
            else
            {
                assert(false, "Unable to find image \(name)")
                return nil
            }
        }
    }
}

...

 theImage.image = getImage(name: "Person")