2016-08-17 58 views
12

我有一個框架,其中包含一個故事板和一組默認的圖像。該框架可以包含在多個應用程序中,並且意圖是應用程序可以根據需要使用自己的變體覆蓋沒有,部分或全部的默認圖像。重寫框架中的故事板中的圖像

我面臨的問題是,我還沒有找到適用於所有情況的解決方案,例如:如果框架包含名爲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://stackoverflow.com/a/28037297/988169)。 – pkc456

+0

請僅在每個帖子提問一個問題,並且在答案發布後不要更改您的問題。 – JAL

回答

9

此代碼有效,但看起來有點笨重,如果有可能的代碼解決方案,它會很棒 - 只需使用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'嗎? –

2

粗糙迅速落實,我願意改進和優化。

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:")之類的東西。