如何在不使用单独的捆绑包的情况下将我的资源文件包含在框架中?

时间:2016-01-28 16:45:33

标签: ios objective-c xcode

我一直在按照本指南创建iOS静态库:https://github.com/jverkoey/iOS-Framework#walkthrough。我设法创建了一个可以导入另一个Xcode项目的框架。

现在,我希望我的框架能够显示故事板。我认为.storyboard文件算作资源。前面的指南指出我应该为我的资源文件创建一个Bundle,比如图像,而不是将它们放在框架本身。

但是,我想把它们放在框架本身。我不想使用单独的捆绑包。

我找到的所有指南都告诉我同样的事情。我理解使用单独捆绑的优点,但我现在不想这样做。

现在,我迷失了如何在我的框架中包含我的.storyboard文件,以便我可以用它来显示它:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"NameOfStoryboard" bundle:[NSBundle bundleForClass:[self class]]];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"NameOfViewController"];
[otherView presentViewController:vc animated:YES completion:NULL];

上面的代码似乎不起作用(它无法找到故事板文件)。我想这是因为.storyboard目前没有包含在框架中。可悲的是,我不知道如何加入它。

在框架的Xcode项目中,在Build Phases下,我看到一个标签为" Copy files"这看起来像我需要的。

enter image description here

现在,我不确定这是做什么的,但无论如何,它似乎无论如何都无法发挥作用。

我也这样做了:

enter image description here

如何在不使用单独的捆绑包的情况下将.storyboard文件包含在我的框架中?

1 个答案:

答案 0 :(得分:-3)

为什么不想为框架使用单独的捆绑包?因此,如果一个应用程序正在使用您的框架,它将能够使用它的资源(Xibs,故事板,等等)

例如,来自使用您的框架的应用程序的调用可能如下所示:

FrameworkViewController *frameworkView = [[FrameworkViewController alloc] initWithNibName:@"FrameworkViewController"
                                                                          bundle:[NSBundle yourFrameworkBundle]];

在您的框架中,您可以编写一个帮助类NSBundle + YourFrameworkBundle,它可以访问框架包:

一个NSBundle + YourFrameworkBundle.h

@interface NSBundle (YourFrameworkBundle)

+ (NSBundle *)yourFrameworkBundle;

@end

一个NSBundle + YourFrameworkBundle.m

#import "NSBundle+YourFrameworkBundle.h"

@implementation NSBundle (YourFrameworkBundle)

+ (NSBundle *)yourFrameworkBundle
{
static NSBundle *frameworkBundle = nil;
static dispatch_once_t predicate;

dispatch_once(&predicate, ^{
    NSString *mainBundlePath = [[NSBundle mainBundle] resourcePath];
    frameworkBundle = [NSBundle bundleWithPath:[mainBundlePath stringByAppendingPathComponent:@"YourFrameworkBundle.bundle"]];
});

return frameworkBundle;
}

@end

要为框架捆绑资源,请创建一个单独的目标,您可以在其中链接所有资源。 enter image description here