【问题标题】:How to override navigation controller after it is pushed?推送后如何覆盖导航控制器?
【发布时间】:2016-10-14 00:03:54
【问题描述】:

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

假设这是我在头文件中继承 NavBarViewController 的第一个类;

//ListingDetailViewController.h
@interface ListingDetailViewController : NavBarViewController

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

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

因此,即使我尝试在 ChatListViewController 的 viewdidLoad 和 viewWillAppear 中再次覆盖后退按钮、标题,这仍会引入与 ListDetailViewController 中相同的导航控制器。这是 ChatListViewController 的标题:

//ChatListViewController.h
@interface ChatListViewController : IPChatListViewController

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

【问题讨论】:

    标签: ios objective-c uinavigationcontroller overriding pushviewcontroller


    【解决方案1】:

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

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

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

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

    如果您确保从这个基本 VC 继承您的视图控制器(不是导航控制器),它将自动替换后退按钮。

    【讨论】:

    • 嗯,非常感谢您为编写此代码所做的努力。我无法理解我从这个 Base VC 继承我的 VC 是什么意思?因为,如果你检查,我在 ChatListViewController 中继承 IPChatListViewController。那么,如何将上面的这段代码修改为我的案例?谢谢。
    • 您仍然可以将这些方法放在您的 ChatListViewController 中。我的项目中总是有一个基本视图控制器类。我尝试从该类中继承我的所有视图控制器。但是如果你不能在一些视图控制器中使用它,你总是可以手动添加这些代码。
    【解决方案2】:

    我通过覆盖 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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多