【问题标题】:Add buttons to UINavigationController subclass将按钮添加到 UINavigationController 子类
【发布时间】:2015-08-03 00:38:16
【问题描述】:

我正在尝试创建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];


}

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

更新 我想在我的图像中为 NavigationController 使用相同的 NavigationController(按钮和颜色......):

更新 所以我以这种方式将我的 navugationController unn 子类化了:

-(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;
}

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

【问题讨论】:

  • 不是navigationItem 属性为零吗?
  • @Astoria 你能检查我的更新吗?

标签: ios objective-c cocoa-touch uinavigationcontroller uikit


【解决方案1】:

子类化设计应该是这样的——

- (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];
}

【讨论】:

  • 对不起,我是初学者,你能解释更多吗?
  • 抱歉,我使用的是故事板,所以我已将 MyOwnNavigationController 类分配给故事板中的导航控制器,但没有发生任何事情,不会从故事板调用 the initWithRootViewController
  • 您好,可以查看我的更新吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2017-09-09
相关资源
最近更新 更多