sciritai
sciritai

Reputation: 3758

was unable to load a nib named "TwitterDrilldownView"

-[UIViewController _loadViewFromNibNamed:bundle:] was unable to load a nib named "TwitterDrilldownView"

I get the above error when I push a new ViewController onto the navigation stack. This is the push code,

[self.navigationController pushViewController:[[[TwitterDrilldownViewController alloc] initWithTwitterAnnotation:temp] autorelease] animated:YES];

Basically I am just pushing a newly allocated and initialized view onto the stack. The init method of the ViewController is,

- (id)initWithTwitterAnnotation:(TwitterInfo *)aPOI {  
  if(self = [super init]) {
    poi = aPOI;
  }

  return self;
}

As you can see I do not use any initialize with nib method and there is no nib file named TwitterDrilldownView in my project.

I did have a nib file before I created the TwitterDrilldownViewController called TwitterDrillDownView but I was using it to test a layout and, again, never used it. When I created TwitterDrilldownViewController the TwitterDrillDownView.nib was present in the project and it was after this stage that I deleted the nib.

The only cause for this problem that I can think of is that Xcode somehow created a dependency on the nib file because the nib file and view controller are named the same(TwitterDrilldownView.nib, TwitterDrilldownViewController.m), as if it was trying to be helpful but is ultimately messing up my project.

I have tried deleting and recreating the view controller in the hope that any references will be destroyed, and removed any reference to nib files in the project but to no avail.

Has anyone please got any experience with this problem or know a possible solution?

Upvotes: 2

Views: 2271

Answers (2)

toblerpwn
toblerpwn

Reputation: 5545

This also happened to me after deleting a XIB file out of my project. However, I did some messing around and was able to resolve the problem.

The key point is that Xcode seems to keep some kind of reference somewhere as you create XIBs and outlets/actions within them, and deleting a XIB file manually simply orphans these references. Removing these connections one-by-one, using the interface builder (UB) and the XIB seems to de-reference them properly.

The solution is then pretty clear:

  1. Re-create a XIB file of the same name and similar construction (including the outlets and actions you had before). (Note: If you can't remember how to re-construct the XIB's outlets and actions, just re-create the XIB file with the same name and skip to my 'if it's still failing' note below.)
  2. Manually, one-by-one, remove all of the outlets and actions in your XIB using interface builder (IB).
  3. Re-build the app; if it works now, you can delete the XIB.

(Note: If it's still failing, you will probably have a different error. If the error refers to key-value compliance then it will list a method in the error - and that method is your problem. Make sure you recreate the named outlet/action in IB, and remove it manually using IB. That seems to de-reference the call in Xcode/your build environment.)

Happy hunting!

Upvotes: 2

Vladimir
Vladimir

Reputation: 170859

UIViewController should be initialized using initWithNibName:bundle: method. In its description stated:

This is the designated initializer for this class.

If you specify nil for the nibName parameter and do not override the loadView method in your custom subclass, the default view controller behavior is to look for a nib file whose name (without the .nib extension) matches the name of your view controller class. If it finds one, the class name becomes the value of the nibName property, which results in the corresponding nib file being associated with this view controller.

So if you do not load you view controller from nib file make sure you override loadView method and set controller's view property in it.
Hope that will help.

Upvotes: 1

Related Questions