You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从AppDelegate迁移到SceneDelegate后navigationItem左右按钮消失

适配Scenes后导航栏左右按钮不显示问题排查

问题背景

收到应用必须升级支持Scenes的警告,按官方文档完成适配(在info.plist中添加UIApplicationSceneManifest、新增SceneDelegate)后,首页UIViewController通过代码在viewDidLoad中设置的navigationItem.leftBarButtonItem与rightBarButtonItem不再显示。首页其他非导航项视图/按钮均正常显示(Storyboard配置),仅代码设置的导航按钮未渲染。

相关代码:

self.navigationItem.leftBarButtonItem = nil;   

UIButton *hamburgerBun = [UIButton buttonWithType:UIButtonTypeCustom];
[hamburgerBun setImage:[[self class] defaultImage] forState:UIControlStateNormal];
[hamburgerBun setFrame: CGRectMake (0, 0, 44.0, 44.0)];
[hamburgerBun addTarget:self action:@selector(toggleLeftPanel) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithCustomView:hamburgerBun];
buttonItem.style = UIBarButtonItemStylePlain;

self.navigationItem.leftBarButtonItem = buttonItem;


self.navigationItem.righttBarButtonItem = nil;  

UIButton *settingsBarButton = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *buttonImage = [UIImage imageNamed:@"pencilEditButton.png"];
[settingsBarButton setImage:buttonImage forState:UIControlStateNormal];
[settingsBarButton setFrame: CGRectMake (0, 0, 44.0, 44.0)];
[settingsBarButton addTarget:self action:@selector(editProject:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *settingsBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:settingsBarButton];
settingsBarButtonItem.style = UIBarButtonItemStylePlain; 

self.navigationItem.rightBarButtonItem = settingsBarButtonItem;

问题原因及解决方案

1. 代码笔误直接导致右侧按钮失效

代码中存在明显拼写错误:

self.navigationItem.righttBarButtonItem = nil;

这里多写了一个t,正确属性名是rightBarButtonItem。这个笔误会让你清空右侧按钮的操作失效,后续设置的按钮无法正常覆盖原有状态,直接造成右侧按钮不显示。修正拼写后重新测试。

2. Scene适配后导航控制器关联错误

适配Scenes后,应用启动逻辑从AppDelegate迁移到SceneDelegate,如果SceneDelegate中根视图控制器配置错误,会导致首页控制器未被导航控制器包裹,navigationItem无法关联到有效导航栏:

  • 检查SceneDelegate的scene:willConnectToSession:options:方法,确保根视图是导航控制器,且首页控制器是导航控制器的根控制器。示例正确配置:
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *rootNav = [mainStoryboard instantiateViewControllerWithIdentifier:@"MainNavigationController"];
self.window.rootViewController = rootNav;

3. 视图生命周期时机问题

若viewDidLoad执行时导航控制器尚未完全初始化,设置的navigationItem可能被后续流程覆盖。可将导航按钮设置代码移至viewWillAppear:或viewDidAppear:中,确保导航栏已完成初始化。

4. 自定义按钮图像加载失败

检查以下两点:

  • defaultImage类方法是否返回有效UIImage实例;
  • pencilEditButton.png是否存在于资源文件中,且已正确添加到目标工程(注意文件名大小写)。
    若图像加载失败,按钮会显示为空,视觉上表现为未渲染。

内容的提问来源于stack exchange,提问作者JeffB6688

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:06:21