22

プロジェクトで使用する一般的なコードを保持するフレームワークを作成しようとしています。オンラインチュートリアルを見つけてフレームワークを作成できましたが、リソース(xibs、画像など)に関連する問題が1つあります。

を使用しMainViewController.xibているを持っているとしましょう。これらはすべて私のフレームワークパッケージに含まれています。UIImageViewtest.png

別のプロジェクトでフレームワークを使用する場合は、それを「バンドルリソースのコピー」ビルドフェーズに追加します。問題は、xibはのようなパスを使用してのみアクセス可能dummy.framework/Resources/MainViewController.xibであり、UIImageView内部はロードできないことtest.pngです。

UIImageViewは、xibも保存されている相対フォルダーからではなく、バンドルのルートからpngを読み込もうとしているようです。

コードとリソースを使用してフレームワークを作成し、それを別のプロジェクトで使用することに成功した人はいますか?

4

7 に答える 7

14

私はこれが古いスレッドであることを知っていますが、新しい人々が同じ間違いをしないようにするためにここに注意があります:

Xcode 6およびiOS8の時点で、Appleには完全にサポートされているファーストパーティのダイナミックフレームワークソリューションが組み込まれています。詳細については、https ://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/を参照してください。 xcode_6_0.html#// apple_ref / doc / uid / TP40014509-SW14

しかし、それが不足しているのは、新しいプロジェクトを作成し、CocoaTouchFrameworkテンプレートを選択することです。

于 2014-10-20T15:14:14.327 に答える
8

フレームワークターゲットを作成し、そのアセットカタログ内の画像にアクセスするために次のことを行いました。

UIImage *img = [UIImage imageNamed:@"IMAGE_NAME_HERE" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:[UITraitCollection traitCollectionWithDisplayScale:[UIScreen mainScreen].scale]];
于 2015-05-05T16:59:33.367 に答える
5

フレームワークを手動で管理することはもうありませんが、代わりにCocoaPodsを使用してお勧め します。


元の答え:

  1. 上記の偽のフレームワーク@wattson12を使用してください。リソースもコンパイルして保存します。
  2. このスクリプトに触発されて、これをターゲットに追加して、リソースをアプリにコピーします。

    SOURCE_PATH="${TARGET_BUILD_DIR}/MYFramework.framework/Resources/"
    TARGET_PATH="${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MYFrameworkResources.bundle"
    mkdir -p $TARGET_PATH
    cp -R $SOURCE_PATH $TARGET_PATH
    

フレームワークをリソースのコピーステップにドラッグすることもできますが、その場合、不要なヘッダーとコンパイルされたコードも追加されます。

編集

IBからこれらのリソース(たとえばpngファイル)を使用するには、次を置き換えます。

MyImage

に:

MYFrameworkResources.bundle/MyImage.png

壊れた画像アイコンをプレビューしますが、実行中は機能します。

コードからペン先をロードします。

[NSBundle loadNibNamed:@"MYFrameworkResources.bundle/MyNib" ...

最後に、これらのメソッドをNSBundleカテゴリに追加して、メインバンドルまたはMYFrameworkResources.bundleにあるNibリソースへのアクセスを容易にすることができます。

@implementation NSBundle (MyCategory)

+ (NSString *)pathForResource:(NSString *)name
                       ofType:(NSString *)extension
{
    // First try with the main bundle
    NSBundle * mainBundle = [NSBundle mainBundle];
    NSString * path = [mainBundle pathForResource:name
                                           ofType:extension];
    if (path)
    {
        return path;
    }

    // Otherwise try with other bundles
    NSBundle * bundle;
    for (NSString * bundlePath in [mainBundle pathsForResourcesOfType:@"bundle"
                                                          inDirectory:nil])
    {
        bundle = [NSBundle bundleWithPath:bundlePath];
        path = [bundle pathForResource:name
                                ofType:extension];
        if (path)
        {
            return path;
        }
    }

    NSLog(@"No path found for: %@ (.%@)", name, extension);
    return nil;
}

+ (NSArray *)loadNibNamed:(NSString *)name
                    owner:(id)owner
                  options:(NSDictionary *)options
{
    // First try with the main bundle
    NSBundle * mainBundle = [NSBundle mainBundle];
    if ([mainBundle pathForResource:name
                             ofType:@"nib"])
    {
        NSLog(@"Loaded Nib named: '%@' from mainBundle", name);
        return [mainBundle loadNibNamed:name
                                  owner:owner
                                options:options];
    }

    // Otherwise try with other bundles
    NSBundle * bundle;
    for (NSString * bundlePath in [mainBundle pathsForResourcesOfType:@"bundle"
                                                          inDirectory:nil])
    {
        bundle = [NSBundle bundleWithPath:bundlePath];
        if ([bundle pathForResource:name
                             ofType:@"nib"])
        {
            NSLog(@"Loaded Nib named: '%@' from bundle: '%@' ", name, bundle.bundleIdentifier);
            return [bundle loadNibNamed:name
                                  owner:owner
                                options:options];
        }
    }

    NSLog(@"Couldn't load Nib named: %@", name);
    return nil;
}

@end

最初にアプリケーションバンドルを調べ、次にMYFrameworkResources.bundleなどを調べます。

于 2012-12-14T00:37:20.367 に答える
4

Swift 3の動的フレームワークから画像をロードするには:

UIImage(named: "name", in: Bundle(for: type(of: self)), compatibleWith: nil)

于 2016-10-12T21:44:58.607 に答える
1

基本的なフレームワークにはほとんどの種類のリソースが含まれていません。リソースを含めるには、この「偽の」フレームワークライブラリを使用します

最終的には、実際のフレームワークを含む.embeddedframeworkフォルダーが作成されますが、バンドルリソースのコピービルドフェーズに追加するリソースも含まれます。私はそれを使用して、xibs、コアデータモデル、画像、およびplistを含めました

于 2012-08-29T14:26:13.003 に答える
-1

簡単な答え:できません。

アプリをコンパイルすると、リンクされたフレームワークのリソースを無視して、「メイン」プロジェクトのリソースを使用してバンドルが生成されます。これには、画像、xib、plistなど(ソースファイル以外のもの)が含まれます。

あなたがする必要があるのは、それらのリソースをメインプロジェクトに追加して、それらがアプリケーション内で使用できるようにすることです。それを回避する最も幸せな方法ではありませんが、それは機能します。

于 2012-08-29T14:24:51.047 に答える
-1

Xcode 7以降、アセットカタログを使用できるようになりました。私の実験では、同じワークスペース内のファイルを少し異なるプロジェクトで参照できるため、ビルドフェーズでアセットをマイクロ管理したり、ターゲットについて心配したりする必要がないことがわかりました。

于 2016-03-10T02:10:10.100 に答える