У меня были проблемы с ответами 2-4 в iOS 4 (из ответа AnswerBot), и нужен был способ загрузить UINavigationController программно (хотя метод NIB работал) ... Итак, я сделал это:
Создан пустой XIB-файл (не указывайте владельца файла), добавьте UINavigationController (предоставьте ему свой пользовательский класс UINavigationController), измените UINavigationBar на свой пользовательский класс (здесь это CustomNavigationBar), затем создайте следующий пользовательский заголовок класса ( CustomNavigationController.h в данном случае):
#import <UIKit/UIKit.h>
@interface CustomNavigationController : UINavigationController
+ (CustomNavigationController *)navigationController;
+ (CustomNavigationController *)navigationControllerWithRootViewController:(UIViewController *)rootViewController;
@end
и пользовательская реализация (CustomNavigationController.mm)
#import "CustomNavigationController.h"
@interface CustomNavigationController ()
@end
@implementation CustomNavigationController
+ (CustomNavigationController *)navigationController
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomNavigationController" owner:self options:nil];
CustomNavigationController *controller = (CustomNavigationController *)[nib objectAtIndex:0];
return controller;
}
+ (CustomNavigationController *)navigationControllerWithRootViewController:(UIViewController *)rootViewController
{
CustomNavigationController *controller = [CustomNavigationController navigationController];
[controller setViewControllers:[NSArray arrayWithObject:rootViewController]];
return controller;
}
- (id)init
{
self = [super init];
[self autorelease]; // We are ditching the one they allocated. Need to load from NIB.
return [[CustomNavigationController navigationController] retain]; // Over-retain, this should be alloced
}
- (id)initWithRootViewController:(UIViewController *)rootViewController
{
self = [super init];
[self autorelease];
return [[CustomNavigationController navigationControllerWithRootViewController:rootViewController] retain];
}
@end
Тогда вы можете просто инициализировать этот класс вместо UINavigationController, и у вас будет собственная панель навигации. Если вы хотите сделать это в xib, измените класс UINavigationController и UINavigationBar внутри вашей XIB.