从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
相关产品推荐
相关产品推荐

