Set a custom subclass of UINavigationBar in UINavigationController programmatically
Does anyone know how can I use my custom subclass of UINavigationBar
if I instantiate UINavigationController
programmatically (without IB)?
Drag a UINavigationController
in IB show me an under Navigation Bar and using Identity Inspectory I can change class type and set my own subclass of UINavigationBar
but programmatically I can't, navigationBar
property of Navigation Controller is readonly...
What should I do to customize the navigation bar programmatically? Is IB more "powerful" than "code"? I believed all that can be done in IB could be done also programmatically.
You don't need to muck with the XIB simply use KVC.
[self.navigationController setValue:[[[CustomNavBar alloc]init] autorelease] forKeyPath:@"navigationBar"];
Since iOS5, apple provides a method to do this directly. Reference
UINavigationController *navigationController= [[UINavigationController alloc]initWithNavigationBarClass:[CustomNavBar class] toolbarClass:nil];
[navigationController setViewControllers:[NSArray arrayWithObject:yourRootViewController]];
As of iOS 4, you can use the UINib
class to help solve this issue.
- Create your custom
UINavigationBar
subclass. - Create an empty xib, add a
UINavigationController
as the single object. - Set the class for the
UINavigationController
'sUINavigationBar
to your custom subclass. - Set your root view controller via one of these methods:
-
[navController setViewcontrollers[NSArray arrayWithObject:myRootVC]];
[navController pushViewController:myRootVC];
-
In code:
UINib *nib = [UINib nibWithNibName:@"YourCustomXib" bundle:nil];
UINavigationController *navController =
[[nib instantiateWithOwner:nil options:nil] objectAtIndex:0];
Now you've got a UINavigationController
with your custom UINavigationBar
.