无法在CocoaPods包中加载NIB。

10

我已经通过CocoaPods将PSCarouselView安装到我的项目中。当我尝试使用这个库时,出现了运行时错误。错误提示无法加载nib文件...

我检查了库,发现nib文件已经正确注册。而且我也检查了目标成员资格,并确保复选框已被选中。然后我检查了podspec文件,发现没有有关该库的podspec,于是我为该库创建了一个podspec文件。使用下面的命令:


```ruby pod spec create PSCarouselView ```
pod spec create [PSCarouselView]https://github.com/DeveloperPans/PSCarouselView

那么我可以检查podspec文件并添加以下命令:

    s.resources = "Resources/*.xib"

   s.resource_bundles = {
    'PSCarouselView' => [
    'Pod/**/*.xib'
实际上,在我添加这些命令到podspec之前,xib文件已经被复制到了我的项目中。我拼命尝试了一下... enter image description here 然后使用下面的代码注册xib文件:
[self registerNib:[UINib nibWithNibName:@"PSCarouselCollectionCell" bundle:nil] forCellWithReuseIdentifier:@"PSCarouselCollectionCell"];

并且标识符也已正确定义;

在此输入图片描述

现在我非常迫切地想知道如何解决这个问题。

以下是错误信息:

MyTestApp[18232:1316081] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/adminuser/Library/Developer/CoreSimulator/Devices/464AB3F8-3C31-4473-AD1B-F554F3F59CDB/data/Containers/Bundle/Application/B4A5F964-A6E0-4357-878F-11A299FD1ACA/MyTestApp.app> (loaded)' with name 'PSCarouselCollectionCell''
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000101598d85 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010100cdeb objc_exception_throw + 48
    2   CoreFoundation                      0x0000000101598cbd +[NSException raise:format:] + 205
    3   UIKit                               0x00000001023dec89 -[UINib instantiateWithOwner:options:] + 499
    4   UIKit                               0x000000010289f553 -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:] + 716
    5   UIKit                               0x000000010289febc -[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:] + 169
    6   PSCarouselView                      0x0000000100b13b92 -[PSCarouselView collectionView:cellForItemAtIndexPath:] + 114
    7   UIKit                               0x000000010288e08f -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:isFocused:] + 483
    8   UIKit                               0x0000000102891d96 -[UICollectionView _updateVisibleCellsNow:] + 4988
    9   UIKit                               0x0000000102896575 -[UICollectionView layoutSubviews] + 258
    10  PSCarouselView                      0x0000000100b13108 -[PSCarouselView layoutSubviews] + 328
    11  UIKit                               0x00000001020d1980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
    12  QuartzCore                          0x0000000105065c00 -[CALayer layoutSublayers] + 146
    13  QuartzCore                          0x000000010505a08e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
    14  UIKit                               0x00000001020c1205 -[UIView(Hierarchy) layoutBelowIfNeeded] + 1129
    15  UIKit                               0x00000001021f65c5 -[UINavigationController _layoutViewController:] + 1613
    16  UIKit                               0x00000001021f53b4 -[UINavigationController _layoutTopViewController] + 268
    17  UIKit                               0x00000001021f26bd -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 856
    18  UIKit                               0x000000010249cc2c -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] + 422
    19  UIKit                               0x000000010249cfa2 -[UINavigationTransitionView _cleanupTransition] + 788
    20  UIKit                               0x00000001020a47ff -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 241
    21  UIKit                               0x00000001020a1706 +[UIViewAnimationState popAnimationState] + 314
    22  UIKit                               0x000000010249c8dd -[UINavigationTransitionView transition:fromView:toView:] + 2640
    23  UIKit                               0x00000001021f7651 -[UINavigationController _startTransition:fromViewController:toViewController:] + 3291
    24  UIKit                               0x00000001021f7c4d -[UINavigationController _startDeferredTransitionIfNeeded:] + 890
    25  UIKit                               0x00000001021f8d0b -[UINavigationController __viewWillLayoutSubviews] + 57
    26  UIKit                               0x00000001023a7503 -[UILayoutContainerView layoutSubviews] + 248
    27  UIKit                               0x00000001020d1980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
    28  QuartzCore                          0x0000000105065c00 -[CALayer layoutSublayers] + 146
    29  QuartzCore                          0x000000010505a08e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
    30  QuartzCore                          0x0000000105059f0c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    31  QuartzCore                          0x000000010504e3c9 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
    32  QuartzCore                          0x000000010507c086 _ZN2CA11Transaction6commitEv + 486
    33  QuartzCore                          0x000000010507c7f8 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
    34  CoreFoundation                      0x00000001014bdc37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    35  CoreFoundation                      0x00000001014bdba7 __CFRunLoopDoObservers + 391
    36  CoreFoundation                      0x00000001014b311c CFRunLoopRunSpecific + 524
    37  UIKit                               0x0000000102011f21 -[UIApplication _run] + 402
    38  UIKit                               0x0000000102016f09 UIApplicationMain + 171
    39  MyTestApp                           0x0000000100a598b2 main + 114
    40  libdyld.dylib                       0x0000000107d9a92d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

如果您正在使用pod作为框架,您可能需要引用框架的bundle。NSString resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"Frameworks/PSCarouselView.framework/PSCarouselView" ofType:@"bundle"]; NSBundle bundle = [NSBundle bundleWithPath:resourceBundlePath]; - Soheil
2个回答

12
如果与您的.xib捆绑在一起(在此示例中为YourView.xib)的 bundle 存储在一个 pods bundle 中,您可以通过以下方式在文件所有者的 UIView 子类中检索 bundle。
let bundle = Bundle(for: self.classForCoder)

然后实例化视图:

nib.instantiate(withOwner: self, options: nil)
let nib = UINib(nibName: "YourView", bundle: bundle)

如果您想在 pod 模块之外以这种方式子类化 UIView,请使用以下代码,因为 'self.classForCoder' 会返回您的子类所在的 bundle。

 let bundle = Bundle(for: <FileOwnerUIViewSubclass>.classForCoder())

2
你能简要解释一下这段代码的作用,为什么它能解决问题以及应该在哪里使用吗? - JJJ

6

您需要包含该pod的捆绑包。

例如,在我的代码中(基于集合视图的货币符号选择器):

public class BGSCurrencyPickerVC: UIViewController,UICollectionViewDelegate {

public override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes

    let podBundle = NSBundle(path: NSBundle(forClass: BGSCurrencyPickerVC.self).pathForResource("BLAMCurrencyPicker", ofType: "bundle")!)

    self.collectionView!.registerNib( UINib(nibName: "BGSCurrencyPickerCVCell", bundle: podBundle), forCellWithReuseIdentifier: "BGSCurrencyPickerCVCell")

举个例子,可以参考基于Collection View的Swift Cocoapod

另一个示例,货币选择器Cocoapod

适用于Swift 3:

    let podBundle = Bundle(path: Bundle(for: BLAMPaymentCVView.self).path(forResource: "BLAMPayment", ofType: "bundle")!)

你需要在资源参数的路径中输入什么?我不太理解这一部分。 - Pavan
@Pavan,资源参数的路径是Pod名称。在我的Swift 3示例中,这是“BLAMPayment”。我将添加另一个示例链接来演示这一点。 - Peter Todd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接