从UINavigationController中控制UINavigationItem内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从UINavigationController中控制UINavigationItem内容相关的知识,希望对你有一定的参考价值。
我试图以编程方式从UINavigationItem
中心位置(视图控制器可以添加自己的按钮)为整个应用程序设置UINavigationController
的内容,例如:
viewDidLoad
的UINavigationController
方法:
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Login"];
[self.navigationBar pushNavigationItem:item animated:NO];
self.navigationItem.topItem.leftBarButtonItems = [[NSArray alloc] initWithObjects: filterBtn, editBtn, nil];
self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects: userBtn, infoBtn, mapsBtn, nil];
然而,当从pushViewController
调用UINavigationController
时,呈现的UINavigationItem
被设置为默认值,其标题等于场景的名称。
[self pushViewController:viewController animated:NO];
没有调用pushViewController
我能看到我的自定义UINavigationItem
。
问题可能是:
- 我正在使用
storyboard
来实例化视图控制器:UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier: screen];
- 而不是
push
我应该使用[self presentViewController:viewController animated:NO completion:nil]
,但是,这种方法完全隐藏了导航栏 - 一个解决方法可能只是提出
UIView
,但我宁愿现在避免它。
我在这做错了什么?
每当推动UIViewController
时,导航项目(左,中,右)都会被替换。
如果没有设置UIViewController
的自定义项目(左,中,右),导航控制器将推送默认项目。
在你的情况下你可以做的是,在UINavigationControllerDelegate
中实现UINavigationController
并实现这个方法navigationController(UINavigationController, willShow: UIViewController, animated: Bool)
方法。您可以在推送UIViewController
之前分配默认导航项。并且还可以检查是否已设置任何自定义项目。
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if viewController.navigationItem.leftBarButtonItem == nil { // viewController.navigationItem.leftBarButtonItems
// assign default item
}
if viewController.navigationItem.rightBarButtonItem == nil { // viewController.navigationItem.rightBarButtonItems
// assign default item
}
if viewController.navigationItem.titleView == nil {
// assign default item
}
}
您还可以查看官方文档here。请参阅左项和自己的单词部分。
选项2
创建一个BaseViewController
并使用BaseViewController
继承您的所有视图。然后在BaseViewController
中,您可以设置所有默认导航项。
class BaseViewController : UIViewController {
override func viewDidLoad() {
self.navigationItem.leftBarButtonItems = [[NSArray alloc] initWithObjects: filterBtn, editBtn, nil];
self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects: userBtn, infoBtn, mapsBtn, nil];
}
}
以上是关于从UINavigationController中控制UINavigationItem内容的主要内容,如果未能解决你的问题,请参考以下文章