开发者

Why isn't [NSBundle mainBundle] working here?

I've never loaded a bundle, so I'm not sure why this is not working. I don't think it matters, but the .xib in question here is in the same Resources folder as all my other .xibs.

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

Returns开发者_Python百科 this error:

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

I find this error strange, because the return type of [NSBundle mainBundle] is of course NSBundle.


There is no such method in NSBundle, hence the error.

I guess you are looking for:

loadNibNamed:owner:options:
  • Documentation link

You can pass nil to the options, as it expect a NSDictionary

So in your case:

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

EDIT

If it still doesn't work, verify you have included <UIKit/UIKit.h>.

EDIT 2

Ok, now I see. You tagged your question with iOS, but now you say it's a Cocoa app.

The loadNibNamed:owner:options: is a UIKit addition, so available only on iPhone.

On Mac OS X, you'll use the + (BOOL)loadNibNamed:(NSString *)aNibName owner:(id)owner class method.

So:

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


Three things:

  1. Make sure that you're spelling the method name right. The error message you give shows the method name as: -loadNibNamed:owner:options, which isn't right. There should be a colon after the "options". Perhaps you missed that in pasting the name into your message, but the lesson here is to check carefully that you're using exactly the right method name, with no spelling errors, omitted parts, missing colons, etc.

  2. Make sure that you're linking against UIKit. NSBundle is part of the Foundation framework, but the -loadNibNamed:owner:options: method comes from a UIKit Additions category on NSBundle that's part of UIKit. If you don't link against UIKit, then, NSBundle won't have that method.

  3. I see that you've removed ios from your list of tags. If you're writing for Cocoa and trying to load a nib, see the NSNib class for some convenient methods for loading nibs.


I have come across the very same problem while fixing an issue in a low-level Cocoa/Objective-C++ framework. Strictly speaking, build issue came from this function:

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 gave me:

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

The issue was not a build configuration, as all standard frameworks were there already. The issue was more trivial: the definition of that single method is present in a separate header. So please be sure to add:

#import <AppKit/NSNibLoading.h>

which contains:

@interface NSBundle(NSNibLoading)

- (BOOL)loadNibNamed:(NSNibName)nibName owner:(nullable id)owner topLevelObjects:(NSArray * _Nullable * _Nullable)topLevelObjects API_AVAILABLE(macos(10.8));

@end

Interestingly enough, CLion gaves me "unused import directive" even though I definitely use it. Hope this helps someone!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜