Between working on a couple updates for our existing apps, I’ve been working on learning some new stuff with the iPhone SDK. Sometimes it’s great to just wipe the canvas and start fresh! So, I’m playing around with which UI* framework elements support custom artwork and creating some custom controls. It’s fun, especially now that I’ve got some solid footing on the default appearance and behaviors of the common controls.
I tossed together a UITabBar app template and started filling out the custom UIViewControllers. The code to push the view controller is pretty standard:
if (myView == nil)
myView = [[UIViewController alloc] initWithNibName:@"testView" bundle:nil];
[self.navigationController pushViewController:myView animated:YES];
I created a corresponding Objective-C UIViewController class, testView, and associated the class in Interface Builder, including the “view” connection.
The test view controller had a couple IBOutlets which I also created in IB and associated too.
Save all… recompile in Xcode, debug – and Boom! “NSUnknownException”, reason: “[<UIView 0x47a3e1> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key testControl.”
Nothing like a helpful error message, eh?
So – a quick return to Interface Builder where I double check the connections, Class Identity, and assorted properties that might trigger the exception. Save all… recompile in Xcode, debug, and Boom! Crashed again.
Okay… time to get more serious. Since these were empty classes anyway, I blew them away and started fresh. Recreated the classes, the controls, the connections, and tried again. No difference. Ugh. I swear I’ve done this before – a lot!
Well, I decided to pull out all of the controls except a UITableView and toss breakpoints throughout the UIViewController class to try to trap and step through exactly where things might be going amiss. Recompile, debug, and things worked great! The view appeared, including the table, but none of my breakpoints caught.
This was very odd, as I had breaks in initWithNibName:bundle:, loadView, viewDidLoad, and – just to be thorough – viewWillAppear:. A little head scratching and I came to the quick conclusion that my custom class, despite being set in Interface Builder, isn’t actually being used. And, after a few more minutes of triple-checking my settings, I discovered the source of the problem – I’d created a UIViewController instead of a “testView” (see above). Changing the code fixed the problem – big surprise.
While I overlooked my declaration initially (as perhaps you did too!) – it just goes to show that sometimes it’s the obvious and before nuking work that probably is okay – give a quick inspection all around.