2012-04-04 6 views
0

У меня есть подкласс UINavigationBar.Как использовать пользовательский UINavigationBar

@interface MyNavigationBar : UINavigationBar 

Сделаны некоторые изменения и теперь хочу, чтобы мое приложение NavigationController бы использовать:

_navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 
[_window addSubview:[_navigationController view]]; 
[self.window makeKeyAndVisible]; 

Я хочу, чтобы _ navigationController бы MyNavigationBar

Как это может быть сделано?

Спасибо.

ответ

4

Вы должны создать XIB с UINavaigationController в нем. Затем вы можете выбрать navigationBar в Interface Builder и изменить класс на ваш подкласс UINavigationBar.

enter image description here

Затем, чтобы сделать это немного легче инстанцирует добавить категорию `UINavigationController как:

@interface UINavigationController (DSCNavigationController) 

+ (UINavigationController *)dsc_navigationControllerWithRootViewController:(UIViewController *)rootViewController; 

@end 

@implementation UINavigationController (DSCNavigationController) 

+ (UINavigationController *)dsc_navigationControllerWithRootViewController:(UIViewController *)rootViewController; 
{ 
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"DSCNavigationController" owner:nil options:nil]; 

    NSAssert(1 == [topLevelObjects count], @"DSCNavigationController should have one top level object"); 

    UINavigationController *navigationController = [topLevelObjects objectAtIndex:0]; 

    NSAssert([navigationController isKindOfClass:[UINavigationController class]], @"Should have a UINavigationController"); 

    [navigationController pushViewController:rootViewController animated:NO]; 

    return navigationController; 
} 

@end 

В верхней части класса, который использует его убеждается импортировать категорию в мой случай это выглядит как

#import "UINavigationController+DSCNavigationController" 

Затем, используя это выглядит как

MyViewController *myViewController = [[MyViewController alloc] init]; 
UINavigationController *navigationController = [UINavigationController dsc_navigationControllerWithRootViewController:myViewController]; 
+0

Не могли бы вы показать мне, как это должно выглядеть в AppDelegate? – Streetboy

+0

Работал. Но это не работает [self.navigationController pushViewController: sendMsg animated: YES]; – Streetboy

+1

В каком классе вы это называете? Убедитесь, что 'NSLog (@"% @ ", self.navigationController);' не является нулевым –

1

UINavigationController имеет свойство только для чтения

@property(nonatomic, readonly) UINavigationBar *navigationBar 

, так как он предназначен только для чтения, вы должны создать подкласс UINavigationBar и переопределить это свойство или сделать его для чтения write.E.g. :

MyNaviagtionBar *myBar = [[MyNavigationBar alloc] init]; 
_navigationController.navigationBar = mybar; 

Или подклассов:

MyNavigationController.h

@class MyNavigationBar; 

@interface MyNavigationController : UINavigationController 
@property(nonatomic, strong) MyNavigationBar *navigationBar; 
@end 

MyNavigationController.m

@implementation MyNavigationController 
@synthesize navigationBar = _navigationBar; 
@end 

А затем изменить

_navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 

в

_navigationController = [[MyNavigationController alloc] initWithRootViewController:self.viewController]; 
+0

Я добавил этот интерфейс: Но когда я пытаюсь сделать то, что вы показали, я получаю это: распайки только для чтения свойства – Streetboy

+0

добавлено подклассы – Pfitz

+0

Я не могу сделать этот огнь ошибки @synthesize = _navigationBar Панель навигации ; Свойство 'navigationBar' пытается использовать ivar '_navigationBar', объявленный в суперклассе 'UINavigationController' – Streetboy