从bundle中加载xib

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从bundle中加载xib相关的知识,希望对你有一定的参考价值。

很多时候为了封装,需要把一个View单独的做成一个组件,比如做成静态库。如果这个view是自定义的,并且使用了xib,那么在主工程中怎么使用呢?在静态库中,添加bundle,编译的时候并不会把xib编程nib,所以在主工程中加载xib就会报错。

技术分享

我们工程静态库中自定义了一个tableViewCell和collectionCell来展示相册和照片使用的

在主工程viewDidLoad方法中注册。

    BOOL nibsRegistered = NO;
    if (!nibsRegistered) {
        NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"do_Album" ofType:@"bundle"];
        NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
        UINib *nib = [UINib nibWithNibName:cellID bundle:bundle];
        [_collectionView registerNib:nib forCellWithReuseIdentifier:cellID];
        nibsRegistered = YES;
    }

如果现在的主工程目录如下图

技术分享

如果按照上述代码加载xib,就会得到下述错误。

Terminating app due to uncaught exception ‘NSInternalInconsistencyException‘, reason: ‘Could not load NIB in bundle: ‘NSBundle </private/var/mobile/Containers/Bundle/Application/2A73657C-E556-4572-B218-3EEB930C615A/TZImagePickerController.app> (loaded)‘ with name ‘doYZAssetCell‘‘

出现上述错误的原因是你打包静态库时,xib不会被编译成nib,而如果你直接在主项目中使用xib,编译的时候就会把xib编程nib。所以需要我们手动把xib编程nib。

通过命令:ibtool --errors --warnings --output-format human-readable-text --compile /Users/yz/ioswork/sourceTree/do-iOS/do_Album/doExtLib/AlbumController/doYZAssetCell.nib /Users/yz/iOSwork/sourceTree/do-iOS/do_Album/doExtLib/AlbumController/doYZAssetCell.xib

编译好nib之后,在bundle中把xib替换掉,然后把bundle拖到主项目中,添加引用即可加载。

上述是我的解决方法,如果你有好的解决方案,欢迎指正。

以上是关于从bundle中加载xib的主要内容,如果未能解决你的问题,请参考以下文章

从我自己的包中加载笔尖?

从 nsbundle 访问图像

无法从包中加载 xib

从mysql的片段中加载ListView

无法在包中加载 Nib - 错误的 nibname 错误

使用 xib 创建可重用的 UIView(并从情节提要中加载)