2016-08-17 9 views
12

私はストーリーボードとデフォルトのイメージセットを含むフレームワークを持っています。フレームワークは複数のアプリに含めることができ、必要に応じて、デフォルトの画像のいずれか、一部、またはすべてを独自のバリアントでオーバーライドできます。フレームワーク内のストーリーボード内のイメージのオーバーライド

私が直面している問題は、すべてのシナリオでうまくいくソリューションを見つけられなかったことです。たとえば、フレームワークにPersonというイメージが含まれていて、フレームワークがPersonフレームワークは、アプリケーションBで使用され、その後、人の独自のバージョンを提供しない。

をフレームワークコードを使用して画像を設定した場合のような:アプリAがそのバリ​​アントを実行しているときに

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

人物の画像が正しく見つかって表示されます。 (App Aには、その資産カタログにPersonのバリアントがあります)ただし、アプリBを実行すると何も表示されません。

一方、コードを使用してイメージを設定しないと(ストーリーボードイメージビューのXcodeの属性インスペクタで設定されている)、アプリケーションBを実行するとデフォルトのフレームワークイメージが正しく表示されますappAのカスタムPersonイメージは表示されません。

私が正常にこれらの3つのシナリオをカバーすることができる方法はあります:

デフォルトの画像は、フレームワークであるともない、アプリAやアプリのBの願いは自分のカスタムイメージ デフォルトのイメージでそれを無効にするためには、フレームワークであり、アプリAはそれをオーバーライドしたいが、アプリBはオーバーライドしない。 デフォルトの画像はフレームワークにあり、アプリAとアプリBの両方で独自のバリアントで上書きします。 (私はフレームワークに数十の画像を含む大きなストーリーボードを持っています、可能であればコードを全く含まないソリューションを持っているのが理想です - つまり、デフォルトの画像名はXcodeの属性インスペクタを使ってイメージビュー画像は自動的に表示されます)

+0

何が起こったときにあなたは何を観察しますか?それはサファリ経由ですか? – Wain

+0

[これ](http://stackoverflow.com/a/28037297/988169)を試しましたか? – pkc456

+0

投稿ごとに1つだけ質問し、回答が投稿された後は質問を変更しないでください。 – 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

スウィフト版も追加できますか? – ale00

+0

Plistにappのリストを追加する必要があり、最新のiOSバージョンでのみ開きます。 – kamleshwar

+0

探しているのではなく、この 'LSApplicationWorkspace'ですか? –

2

ラフスウィフトの実装、私は改善と最適化に開いています。 UIApplicationが使用できないので、あなたが#selector(UIApplication.sharedApplication)#selector(UIApplication.openURL(_:))を使用することはできません

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) 
    } 
} 

。今のところObjective-Cセレクタとしての文字列、またはSelector("openURL:")のような文字列を使用することに固執する必要があります。

関連する問題