I’m working in Xcode 4.3.2.
I’m trying to load a Nib programmatically instead of using Storyboards. Storyboards seems a lot simpler, but unfortunately they are not compatible with iOS 4 & I’m building an application that requires backwards compatibility.
Here’s my problem: I’m trying to load the main view – a simple view with a green background. Currently there is no default view.
My files are:
AppDelegate.h/.m
GreenViewController.h/.m
SwitchViewController.h/.m
I want to the green screen to load when the app begins so in AppDelegate.m I have:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil];
//UIView *switchView = self.switchViewController.view;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
In SwitchViewController.m I have:
- (void)viewDidLoad
{
self.greenViewController = [[GreenViewController alloc] initWithNibName:@"GreenView" bundle:nil];
[self.view insertSubview:self.greenViewController.view atIndex:0];
[super viewDidLoad];
}
With the simple initWithNibName filled in with the default code.
In GreenViewController.m I have:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
Here is the main functionality of everything. When I run the app, I immediately get the error:
2012-10-09 12:34:35.586 MyViewSwitcher[5210:f803] -[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310
2012-10-09 12:34:35.587 MyViewSwitcher[5210:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310'
Can someone please help me understand the cause of my error? I made sure the the “Custom Class” of the GreenView.xib is the “GreenViewController” in the Identity Inspector. Also, I made sure that the referencing outlet for “View” was the file’s owner. I want to load the GreenView nib when my app launches. Eventually, I will switch views by adding a button, but so far I haven’t been able to even load the main view. I’m not sure what I’m misunderstanding.
Thank you in advance for you help!
The problem is not with loading the nib. The problem is on this line:
Here you are using “dot syntax“, which is explained in The Objective-C Programming Language. When you set a property using that syntax, the compiler transforms it into a regular Objective-C message like this:
At runtime, the system is telling you that your
AppDelegateobject doesn’t understand thesetSwitchViewController:method. You need to use an@synthesizedirective, which is explained in The Objective-C Programming Language, to tell the compiler to implement thesetSwitchViewController:method for you: