ios - 将按钮添加到 UINavigationController 子类

标签 ios objective-c cocoa-touch uinavigationcontroller uikit

我正在尝试创建UINavigationController的可重用子类。这是我的代码:

    @interface MainNavigationController : UINavigationController
...
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationBar.barTintColor = primaryOrange;
    self.navigationBar.tintColor = white;

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"search"] style:UIBarButtonItemStylePlain target:self action:nil];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menu"] style:UIBarButtonItemStylePlain target:self action:nil];


}

所以问题是导航栏的颜色发生了变化,但按钮却没有出现。
我在这里错过了什么?

更新 我希望图像中的导航 Controller 具有相同的导航 Controller (按钮和颜色...): enter image description here

更新 所以我用这种方式对我的 navugationController 进行子类化:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"search"] style:UIBarButtonItemStylePlain target:self action:nil];
    viewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menu"] style:UIBarButtonItemStylePlain target:self action:@selector(showMainMenu)];

}

- (id)initWithRootViewController:(UIViewController *)rootViewController {
    self = [super initWithRootViewController:rootViewController];
    if (self) {
        rootViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"search"] style:UIBarButtonItemStylePlain target:self action:nil];
        rootViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menu"] style:UIBarButtonItemStylePlain target:self action:@selector(showMainMenu)];


    }
    return self;
}

这项工作有效,但唯一的问题是,当我按下 View 而不是左侧的后退按钮时,我总是得到搜索图标,如何修复它(我希望左侧有父级的搜索按钮,左侧有后退按钮) subview )?

最佳答案

子类化设计应该这样 -

- (id)initWithRootViewController:(UIViewController *)rootViewController {
    self = [super initWithRootViewController:rootViewController];
    if (self) {
        [self setLeftButtonToController:rootViewController];
    }
    return self;
}

- (void)setLeftButtonToController:(UIViewController *)viewController {
    UIBarButtonItem *closeItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(dismissController)];
    [viewController.navigationItem setRightBarButtonItem:closeItem];
}

根据要求提供完整代码 -

//
//  MyOwnNavigationController.h
// 
//


#import <UIKit/UIKit.h>

@interface MyOwnNavigationController : UINavigationController
- (id)initWithRootViewController:(UIViewController *)rootViewController;
@end



//
//  MyOwnNavigationController.m
// 
//


#import "MyOwnNavigationController.h"

@interface MyOwnNavigationController ()

@end

@implementation MyOwnNavigationController



- (id)initWithRootViewController:(UIViewController *)rootViewController {
    self = [super initWithRootViewController:rootViewController];
    if (self) {
        [self setLeftButtonToController:rootViewController];
    }
    return self;
}

- (void)setLeftButtonToController:(UIViewController *)viewController {
    UIBarButtonItem *closeItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(dismissController)];
    [viewController.navigationItem setRightBarButtonItem:closeItem];
}


@end

如何使用 -

TwoViewController * viewController = [[TwoViewController alloc] initWithNibName:@"TwoViewController" bundle:nil];
    MyOwnNavigationController *navController = [[MyOwnNavigationController alloc] initWithRootViewController:viewController];

更新 StoryBroad ---- 将以下方法添加到 MyOwnNavigationController.m

- (void) loadView 
{
    UIBarButtonItem *closeItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(dismissController)];
        [self.rootViewController.navigationItem setRightBarButtonItem:closeItem];
}

关于ios - 将按钮添加到 UINavigationController 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30372135/

相关文章:

objective-c - 使用 prepareForSegue 在 View 之间发送图像

iphone - ALAsset 图像大小

html - 如何在swift中从字符串中获取html属性值

ios - 为什么 AVPlayer 边界时间观察器不起作用?

ios - 魔法记录新手: context not creating rows in datastore

iphone - 阻止触摸传播到另一个 View

objective-c - 核心数据-双属性-基础数学运算

iphone - 如何在 tabBar 按钮的操作上从一个文本字段移动到下一个文本字段

ios - 如何设置即将加载到 UITabBarController 中的 UIViewController 的属性?

javascript - 无法使用 JavaScript 在 iphone 上播放声音但可以在 Android 上播放