将.xib文件放在框架项目中的哪里?

时间:2016-03-11 14:32:48

标签: ios xib cocoa-touch

我失去了半天这一点,我无法在网上看到直接的解决方案。

我创建了一个iOS CocoaTouch框架。我有一些私人和公共课程,一切正常。 问题 是指 在该框架中添加.xib文件

在我的框架中,我想实例化.xib文件,我得到的错误是:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/dino/Library/Developer/CoreSimulator/Devices/FEDECDC2-D4EA-441E-B53B-329A5B3DFB7A/data/Containers/Bundle/Application/78CEC01F-4C36-4143-A7D6-DDE6CCAC801B/MyApp.app> (loaded)' with name 'NUInAppMessageView''

我听说.xib文件不能包含在静态库中,但我认为它们应该能够在框架内使用。

我的框架目标包含之前的“Copy Bundle Resources”,当我在框架项目中创建它时,会自动添加此.xib文件。

enter image description here

我已经在一些地方读过,应该在一个单独的。 bundle 目标中添加资源,但是在创建新目标时没有“bundle”选项,我相信这是旧的静态-library天。

这是我用来初始化我的视图的代码(在框架内):

NSBundle * frameworkBundle = [NSBundle bundleForClass:[self class]]; // fine (not nil)

NUInAppMessageView *view = [[frameworkBundle loadNibNamed:@"NUInAppMessageView" owner:self options:nil] firstObject]; // <-- CRASH

我试图将其分解为更多方法调用,并认为Nib本身正在创建:

UINib *nib = [UINib nibWithNibName:@"NUInAppMessageView"
                                bundle:frameworkBundle]; // fine (not nil)
NSArray *objects = [nib instantiateWithOwner:self options:nil]; // <-- CRASH

我再也没有想法了。我尝试使用项目清理,删除派生数据,但他们似乎没有完成这项工作。

我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:10)

在iOS项目的框架中放置Nib文件的位置?

我的回答背景:
我试图导出一些UITableView相关的实现,并且它包含UITableViewCell .xib个文件。他们最后会变成.nib个文件! ;-)我指的是那些Nib文件如下:

[[NSBundle mainBundle] loadNibNamed:customCellID owner:nil options:nil];

<强>解释
但是我做错了的是,我构建了一个静态Cocoa Touch Framework并尝试在另一个Application中使用它。那么在运行时什么会成为MainBundle?绝对是我的UITableView实现试图在App的主要包中找到customCellID的Nib文件。

<强>答案:
所以我修改了我的UITableView实现上面的代码段,如下所示:

    NSString *frameworkBundleId = @"com.randika.MyFrameworkBundleIDHere";
    NSBundle *resourcesBundle = [NSBundle bundleWithIdentifier:frameworkBundleId];

    customCell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:customCellID];
    if (customCell == nil) {
       NSArray *nibs = [resourcesBundle loadNibNamed:emptyCellID owner:nil options:nil];
       customCell = [nibs objectAtIndex:0];
    }

我用UITableView实现构建的框架并没有再次给出上述错误! : - )

希望这个答案可能对那里的人有所帮助!

干杯! : - )

答案 1 :(得分:0)

带有.xib文件的控制器的通用解决方案

public extension UIViewController {

    //** loads instance from right framework bundle, not main bundle as UIViewController.init() does
    private static func genericInstance<T: UIViewController>() -> T {
        return T.init(nibName: String(describing: self), bundle: Bundle(for: self))
    }

    public static func instance() -> Self {
        return genericInstance()
    }
}

用作

YourViewController.instance()

答案 2 :(得分:0)

更简单的方法是 self 引用包。

 let bundle = Bundle(for: type(of: self))