【问题标题】:Why isn't [NSBundle mainBundle] working here?为什么 [NSBundle mainBundle] 不在这里工作?
【发布时间】:2011-09-07 15:11:47
【问题描述】:

我从来没有加载过捆绑包,所以我不确定为什么这不起作用。我不认为这很重要,但这里有问题的 .xib 与我的所有其他 .xib 位于同一个 Resources 文件夹中。

NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"S3AsyncView" owner:self];

返回此错误:

Instance method -loadNibNamed:owner not found.  Return type defaults to id

我觉得这个错误很奇怪,因为[NSBundle mainBundle]的返回类型当然是NSBundle。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    NSBundle中没有这样的方法,所以报错。

    我猜你正在寻找:

    loadNibNamed:owner:options:
    

    您可以将nil 传递给选项,因为它期望NSDictionary

    所以在你的情况下:

    NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"S3AsyncView" owner:self options:nil];
    

    编辑

    如果仍然不起作用,请确认您已包含 <UIKit/UIKit.h>

    编辑 2

    好的,现在我明白了。你用 iOS 标记了你的问题,但现在你说它是一个 Cocoa 应用程序。

    loadNibNamed:owner:options: 是 UIKit 添加的,因此仅在 iPhone 上可用。

    在 Mac OS X 上,您将使用 + (BOOL)loadNibNamed:(NSString *)aNibName owner:(id)owner 类方法。

    所以:

    NSArray *array = [ NSBundle loadNibNamed: @"whatever" owner: self ];
    

    【讨论】:

    • Yoikes,这是一个可可应用程序。我需要 UIKit 做什么,我没有看到任何 UI 元素?
    • 对不起,错误标记,但我想这让我回到我原来的问题。 [NSBundle loadNibNamed:@"FilePanel" owner:self];工作和 NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"S3AsyncView" owner:self];给我上面的错误。
    • 因为没有这样的实例方法。这是一个方法。
    • 嗯,好的。我遵循了一些针对 ios 的说明,但我没有意识到会有如此根本的差异。谢谢。
    【解决方案2】:

    三件事:

    1. 确保方法名称的拼写正确。您给出的错误消息显示方法名称为:-loadNibNamed:owner:options,这是不对的。 “选项”后面应该有一个冒号。也许您在将名称粘贴到消息中时错过了这一点,但这里的教训是仔细检查您使用的方法名称是否完全正确,没有拼写错误、省略部分、缺少冒号等。

      李>
    2. 确保链接到 UIKit。 NSBundle 是 Foundation 框架的一部分,但 -loadNibNamed:owner:options: 方法来自 NSBundle 上的 UIKit Additions 类别,它是 UIKit 的一部分。如果你不链接 UIKit,那么 NSBundle 就没有那个方法。

    3. 我看到您已从标签列表中删除了。如果您正在为 Cocoa 编写代码并尝试加载 nib,请参阅 NSNib 类,了解一些加载 nib 的便捷方法。

    【讨论】:

      【解决方案3】:

      我在修复低级 Cocoa/Objective-C++ 框架中的问题时遇到了同样的问题。严格来说,构建问题来自这个函数:

      bool osxNibLoadMenuNibFile()
      {
          const auto cvAppKitVersion = floor( NSAppKitVersionNumber );
          if( cvAppKitVersion >= NSAppKitVersionNumber10_8 )
          {
              NSBundle * mainBundle = [NSBundle mainBundle];
              NSDictionary * bundleInfoDict = [mainBundle infoDictionary];
              if( bundleInfoDict != nil )
              {
                  NSString * mainNibFleNameStr = [bundleInfoDict valueForKey:@"NSMainNibFile"];
                  if( mainNibFleNameStr != nil )
                  {
                      if( [mainBundle loadNibNamed:mainNibFleNameStr owner:[NSApplication sharedApplication] topLevelObjects:nil] )
                      {
                          return true;
                      }
                  }
              }
          }
          return false;
      }
      

      Clang 给了我:

      warning: instance method '-loadNibNamed:owner:topLevelObjects:' not found (return type defaults to 'id') [-Wobjc-method-access]
      

      问题不在于构建配置,因为所有标准框架都已经存在。问题更简单:该单一方法的定义存在于单独的标头中。所以请务必补充:

      #import <AppKit/NSNibLoading.h>
      

      其中包含:

      @interface NSBundle(NSNibLoading)
      
      - (BOOL)loadNibNamed:(NSNibName)nibName owner:(nullable id)owner topLevelObjects:(NSArray * _Nullable * _Nullable)topLevelObjects API_AVAILABLE(macos(10.8));
      
      @end
      

      有趣的是,CLion 给了我“未使用的导入指令”,尽管我确实使用了它。希望这对某人有帮助!

      【讨论】:

        猜你喜欢
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        相关资源
        最近更新 更多