推送后如何覆盖导航控制器?

How to override navigation controller after it is pushed?

我想用自己的后退按钮、标题等覆盖到我自己的导航控制器。但是在我按下视图控制器之后,默认情况下显示堆栈中最后一个视图的导航栏,它是在之前 class.

假设这是我的第一个 class,它继承 header 文件中的 NavBarViewController 作为;

//ListingDetailViewController.h
@interface ListingDetailViewController : NavBarViewController

并且,在 ListingDetailViewController 中,我通过以下方式推送视图:

//ListingDetailViewController.m
ChatListViewController *chatList= [[ChatListViewController alloc]init];
[self.navigationController pushViewController:chatList animated:YES];

所以这仍然会带来与 ListingDetailViewController 中相同的导航控制器,即使我试图覆盖后退按钮,在 ChatListViewController 的 viewdidLoad 和 viewWillAppear 中再次标题。这是 ChatListViewController 的 header:

//ChatListViewController.h
@interface ChatListViewController : IPChatListViewController

我怎样才能做到这一点?任何帮助深表感谢。谢谢。

我为此使用了 BaseViewController class。将此代码粘贴到您的基本控制器中:

if (self.navigationController.viewControllers)
{
    if (self.navigationController.viewControllers.count > 1)
    {
        [self createBackButton];
    }
    else
    {
        //[self createSideBarButton];
    }
}
else
{
    //[self createSideBarButton];
} 

在你的基础中包含这个方法class:

- (UIBarButtonItem *)createBackButton
{

    UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    negativeSeperator.width = 0;
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"navigation_back_button.png"] style:UIBarButtonItemStylePlain target:self.navigationController action:@selector(popViewControllerAnimated:)];

    [item setTintColor:[UIColor whiteColor]];
    self.navigationItem.leftBarButtonItems = [NSArray arrayWithObjects:negativeSeperator,item, nil];
    return item;
}

如果您确保从该基础 class 子class 您的视图控制器(不是导航控制器)VC,它将自动替换后退按钮。

我通过覆盖 viewDidAppear 中的按钮找到了解决方案,因为在 viewDidLoad 之前它将重新使用继承的导航栏。所以,

-(void)viewDidAppear:(BOOL)animated {
[self overwriteBackButton];
}

然后:

- (void)overwriteBackButton {
UIImage *backNormal = [UIImage imageNamed:@"backButton"];
_navBarLeftButton = [OpenSansButton buttonWithType:UIButtonTypeCustom];
_navBarLeftButton.frame = CGRectMake(10, 10, 35, 35);
[_navBarLeftButton setImage:backNormal forState:UIControlStateNormal];
[_navBarLeftButton addTarget:self action:@selector(backToList) forControlEvents:UIControlEventTouchUpInside];
[self.navigationController.navigationBar addSubview:_navBarLeftButton];
}

它被触发到:

-(void)backToList
{
[self.navigationController popViewControllerAnimated:YES];
}