2016-07-28 4 views
1

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

私が直面している問題は、すべてのシナリオでうまくいくソリューションを見つけられなかったことです。 フレームワークにPersonというイメージが含まれていて、フレームワークがアプリケーションA

をフレームワークコードを使用して画像を設定した場合等:その後人の独自のバージョンを提供しない人、およびフレームワークは、アプリケーションBで使用されそして

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

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

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

私が正常にこれらの3つのシナリオカバーできる方法があります:デフォルトの画像は、フレームワークであるともない、アプリAやアプリのB が自分のカスタムイメージ

  • デフォルトのイメージでそれを上書きしたい

    1. は、 にあり、フレームワークとアプリAはそれをオーバーライドしたいがアプリBはオーバーライドしたくない。
    2. デフォルトの画像はフレームワークにあり、アプリAとアプリBの両方が に変更したい場合は、独自のバリアントで上書きします。

    (私は、フレームワークに数十の画像を含む大きなストーリーボードを持っています。できるだけコードを含まないソリューションが大好きです。つまり、デフォルト画像名はXcodeの属性インスペクタで設定されています。画像が自動的に表示され、画像が自動的に表示されます)

  • 答えて

    0

    このコードは機能しますが、ちょっとしたように思えますが、コードレス解決策があれば素晴らしいかもしれません - たとえば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") 
    
    関連する問題