重写框架中的故事板中的图像
我有一个框架,其中包含一个故事板和一组默认的图像。该框架可以包含在多个应用程序中,并且意图是应用程序可以根据需要使用自己的变体覆盖没有,部分或全部的默认图像。重写框架中的故事板中的图像
我面临的问题是,我还没有找到适用于所有情况的解决方案,例如:如果框架包含名为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的属性检查器设置的图像视图,如果应用程序在其资产目录中提供自己的图像版本,图像会自动显示)
此代码有效,但看起来有点笨重,如果有可能的代码解决方案,它会很棒 - 只需使用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")
你可以添加一个Swift版本吗? – ale00
您需要在Plist中添加应用程序列表,然后才会在最新的iOS版本中打开。 – kamleshwar
不用看,这是'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:")
之类的东西。
你发现什么时候发生?它是通过Safari吗? – Wain
你有没有试过[这个](http://stackoverflow.com/a/28037297/988169)。 – pkc456
请仅在每个帖子提问一个问题,并且在答案发布后不要更改您的问题。 – JAL