【问题标题】:Where to put .xib file inside framework project?将 .xib 文件放在框架项目中的什么位置?
【发布时间】:2016-06-26 20:26:09
【问题描述】:

我花了半天时间来解决这个问题,我在网上看不到直接的解决方案。

我创建了一个 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文件不能包含在静态库中,但我认为它们应该能够在框架中使用。

我的框架目标包含之前的“复制捆绑资源”,这个 .xib 文件是在我在框架项目中创建时自动添加的。

我在一些地方读到了资源应该添加到单独的 .bundle 目标中,但是在创建新目标时没有“bundle”选项,我相信这是旧静态的形式-图书馆日。

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

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

我已经没有想法了。我尝试使用项目 Clean,删除派生数据,但它们似乎没有完成这项工作。

我错过了什么吗?

【问题讨论】:

  • 你的代码和我的唯一明显的区别是我从主代码中加载了那个笔尖,而不是从框架代码中,但这只是一个意外;这没什么区别。我只是重写了它,以便从框架代码中加载 nib,它也可以正常工作。
  • @matt 我将删除所有内容并创建新的 .xib。可能是 Xcode 在某处使用缓存设置搞砸了。谢谢。
  • 抱歉,我无法真正回答这个问题。有时,仅仅显示“是的,这应该有效,你没疯”会有所帮助。 :)
  • @matt 至少我现在可以享受周末并在周一解决这个问题:)

标签: ios xib cocoa-touch


【解决方案1】:

在 iOS 项目的框架中将 Nib 文件放在哪里?

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

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

说明:
但在这里我做错的事情是,我构建了一个静态 Cocoa Touch 框架并尝试在另一个应用程序中使用它。那么在运行时,MainBundle 会变成什么?绝对是我的 UITableView 实现试图在应用程序的主包中找出 customCellID 的 Nib 文件。

答案:
所以我修改了我的UITableView 实现的上面代码sn-p 如下:

    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 实现构建的框架再也没有出现上述错误! :-)

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

干杯! :-)

【讨论】:

    【解决方案2】:

    带有 .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()
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 2010-10-11
        • 2013-03-08
        • 2013-12-26
        相关资源
        最近更新 更多