0

のサブクラスがありUINavigationBarます。

@interface MyNavigationBar : UINavigationBar

いくつかの変更を加え、今度は私のアプリケーションNavigationControllerがそれを使用することを望みます:

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

_navigationControllerにMyNavigationBar必要です

これはどのように行うことができますか?

ありがとう。

4

2 に答える 2

4

を含むxibを作成する必要がありますUINavaigationController。次に、Interface Builderでを選択しnavigationBar、クラスをのサブクラスに変更できますUINavigationBar

ここに画像の説明を入力してください

次に、これをインスタンス化するのを少し簡単にするために、次のようなカテゴリを`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];
于 2012-04-04T08:54:52.117 に答える
1

UINavigationControllerには読み取り専用プロパティがあります

@property(nonatomic, readonly) UINavigationBar *navigationBar

読み取り専用なので、UINavigationBarをサブクラス化してこのプロパティをオーバーライドするか、読み取り/書き込みにする必要があります。例:

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];
于 2012-04-04T07:59:27.570 に答える