0

私のアプリでは、カスタム UINavigationBar を作成し、タイトル画像、戻るボタン、サインオフ ボタンを含むナビゲーション バーのような UINavigationBar をカスタマイズするためのさまざまなメソッドを記述しました。現在のビューコントローラーに基づいてナビゲーションバーを変更する必要があります。

これが私の CustomUINavigationClass です

#import <UIKit/UIKit.h>

typedef enum {
    simple = 1,
    back,
    signoff,
    both
} NavBarChoices;


NavBarChoices optionSelect;

@interface CustomNavigationBar : UINavigationBar
{
    UIBarButtonItem * menuButton;
    UIButton * showEditButton;
}

- (id)initWithFrame:(CGRect)frame andOption:(NavBarChoices)choice;
@end

.m

#import "CustomNavigationBar.h"

@implementation CustomNavigationBar

- (id)initWithFrame:(CGRect)frame andOption:(NavBarChoices)choice
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CustomNavigationBar"
                                                              owner:self
                                                            options:nil];

        if ([arrayOfViews count] < 1){
            return nil;
        }
        optionSelect = choice;
        CustomNavigationBar *newView = [arrayOfViews objectAtIndex:0];

        self = newView;

    }
    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{

    switch (optionSelect) {
        case 1:
            [self drawSimpleNavBar];
            break;
        case 2:
            [self drawWithBackOnly];
            break;
        case 3:
            [self drawWithSignOffOnly];

            break;
        case 4:
            [self drawWithBackAndSignOff];
            break;

        default:
            break;
    }

}

-(void)drawSimpleNavBar {

    self.tintColor = [UIColor whiteColor];
    self.backgroundColor = [UIColor whiteColor];
    UIImage *image = [UIImage imageNamed:@"title_logo.png"];
    [image drawInRect:CGRectMake(100, 13, 104, 20)];

    UIImage *menuImage = [UIImage imageNamed:@"menu_off.png"];
    showEditButton = [UIButton buttonWithType:UIButtonTypeCustom];
    showEditButton.bounds = CGRectMake(0, 0, menuImage.size.width, menuImage.size.height+10);
    showEditButton.frame = CGRectMake(2, 10, menuImage.size.width, menuImage.size.height);
    [showEditButton setImage:menuImage forState:UIControlStateNormal];
    [showEditButton setImage:[UIImage imageNamed:@"menu_on.png"] forState:UIControlStateSelected];
    [showEditButton addTarget:self action:@selector(showMenu) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:showEditButton];

}

-(void)drawWithBackOnly {

    self.tintColor = [UIColor whiteColor];
    self.backgroundColor = [UIColor whiteColor];
    UIImage *image = [UIImage imageNamed:@"title_logo.png"];
    [image drawInRect:CGRectMake(100, 13, 104, 20)];

    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [backButton setTitle:@"Back" forState:UIControlStateNormal];

    [backButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
    backButton.frame = CGRectMake(0, 3, 80, 30);
    backButton.titleLabel.font = [UIFont boldSystemFontOfSize:12];
    [backButton sizeToFit];
    [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:backButton];

}

-(void)drawWithSignOffOnly {

}


-(void)drawWithBackAndSignOff {

}

-(void)showMenu {
    NSLog(@"Clicked");
    showEditButton.hidden = YES;
    [showEditButton setImage:[UIImage imageNamed:@"menu_on.png"] forState:UIControlStateNormal];
}


@end

そして、私はこれを App Delegate のように呼び出しています:

navigationBar = [[CustomNavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 44) andOption:simple];
    UINavigationController * nav = [[UINavigationController alloc]initWithNavigationBarClass:[navigationBar class] toolbarClass:nil];

    self.viewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    [nav setViewControllers:@[_viewController] animated:NO];

self.window.rootViewController = nav;

これで、クリック時に最初のビュー コントローラーにボタンができました。同じ NavigationController のナビゲーション バーを変更するために、CustomNavigationBar クラスに要求を送信する別のビュー コントローラーをプッシュしたいと考えています。

ガイドしてください。現在、新しいコントローラーのviewDidLoadメソッドを変更しようとしていますが、UINavigationControllerのNavigationBarプロパティが読み取り専用であるため、新しいナビゲーションバーをそれに割り当てることができないか、そうでなければ私はこのようなことをしたでしょう

CustomNavigationBar * navBar = [[CustomNavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 44) andOption:2];
self.navigationController.navigationBar = navBar;

助けてください。

ありがとう、

4

1 に答える 1

0

xib ユーティリティで NIB とクラス名を定義しましたか? その場合、クラス名とNIB名が同じかどうかを確認してください。この状況でうまくいくことを願っています

于 2013-01-24T04:35:17.403 に答える