【问题标题】:Prevent custom UINavigationBar elements from changing between views防止自定义 UINavigationBar 元素在视图之间更改
【发布时间】:2026-01-23 00:20:04
【问题描述】:

简单的问题:在我的应用程序的主视图控制器(位于导航控制器中)中,我正在使用如下内容自定义导航栏:

self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"titleImage"]];

UIButton *menuButton = [[UIButton alloc] init];
[menuButton setImage:[UIImage imageNamed:@"menuIcon"] forState:UIControlStateNormal];
[menuButton setFrame:CGRectMake(0, 0, 34, 34)];

UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithCustomView:menuButton];
self.navigationItem.rightBarButtonItem = menuItem;

我希望这些元素(标题视图和右栏按钮)在我将新视图控制器推入和弹出导航控制器时在整个应用程序中保持一致。

当然,我可以在推送到导航堆栈的每个视图控制器的viewDidLoad 中设置我的自定义项,但这意味着在两个视图控制器之间的动画期间,我的自定义项是动画进出的,它不像我想要的那样干净。

关于在从 vc 切换到 vc 时如何在导航栏上维护这些自定义元素有什么建议吗?谢谢!

【问题讨论】:

    标签: iphone ios uinavigationcontroller ios7 uinavigationbar


    【解决方案1】:

    您可以创建自己的导航项类,它是 UIButton 的子类,并在该类中设置所有外观,然后只需将您的导航项设置为那些自定义 UIButton。

    类似这样的:

    在 CustomButton.h 中

    #import <UIKit/UIKit.h>
    
    @interface CustomButton : UIButton
    
    @end
    

    然后在CustomButton.m中

    @implementation CustomButton
    
    - (id)initWithFrame:(CGRect)frame
     {
         self = [super initWithFrame:frame];
         if (self) {
                //Set images etc.
                [menuButton setImage:[UIImage imageNamed:@"menuIcon"] forState:UIControlStateNormal];
                [menuButton setFrame:CGRectMake(0, 0, 34, 34)];
            }
            return self;
        }
    
    
    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
        // Drawing code
    }
    */
    
    @end
    

    然后在你的 viewController 中:

    #import CustomButton.h
    
    - (void)viewDidLoad
    {
         CustomButton *button = [[CustomButton alloc]init];
         self.navigationItem.leftBarButton = [[UIBarButtonItem alloc] initWithCustomView:button];
    }
    

    【讨论】: