重写框架中的故事板中的图像

问题描述:

我有一个框架,其中包含一个故事板和一组默认的图像。该框架可以包含在多个应用程序中,并且意图是应用程序可以根据需要使用自己的变体覆盖没有,部分或全部的默认图像。重写框架中的故事板中的图像

我面临的问题是,我还没有找到适用于所有情况的解决方案,例如:如果框架包含名为Person的图像,并且该框架由应用程序A使用,该应用程序A提供它自己的Person版本如果框架设置使用代码图像如

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

然后,当应用程序A被运行其变体,并且所述框架用于通过应用程序B,其不提供其自己的人的版本,那么Person图像的名称被找到并正确显示。 (应用程序A在其资产目录中有Person的变体)但是,当应用程序B运行时,不会显示任何内容。另一方面,如果我没有使用代码设置图像(例如,它设置在故事板图像视图的Xcode的属性检查器中),那么当应用程序B运行时,现在默认的框架图像会正确显示,不过现在应用程序A的自定义人员图像未显示。

有没有一种方法可以让我成功地覆盖这些三种情形:

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

+0

你发现什么时候发生?它是通过Safari吗? – Wain

+0

你有没有试过[这个](http://*.com/a/28037297/988169)。 – pkc456

+0

请仅在每个帖子提问一个问题,并且在答案发布后不要更改您的问题。 – JAL

此代码有效,但看起来有点笨重,如果有可能的代码解决方案,它会很棒 - 只需使用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") 
+0

你可以添加一个Swift版本吗? – ale00

+0

您需要在Plist中添加应用程序列表,然后才会在最新的iOS版本中打开。 – kamleshwar

+0

不用看,这是'LSApplicationWorkspace'吗? –

粗糙迅速落实,我愿意改进和优化。

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:")之类的东西。