从 UINavigationController 中控制 UINavigationItem 内容
Controlling UINavigationItem content from within UINavigationController
我正在尝试从 UINavigationController
中的中央位置以编程方式为整个应用程序设置 UINavigationItem
的内容(然后视图控制器可以添加自己的按钮),例如:
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];
但是,当从 UINavigationController
调用 pushViewController
时,显示的 UINavigationItem
被设置为默认值,其标题等于场景名称。
[self pushViewController:viewController animated:NO];
无需调用 pushViewController
我就能看到我的自定义 UINavigationItem
。
问题可能是:
我正在使用 storyboard
实例化视图控制器:UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier: screen];
我应该使用 [self presentViewController:viewController animated:NO completion:nil]
而不是 push
,但是,这种方法完全隐藏了导航栏
解决方法可能是只显示 UIView
,但我宁愿暂时避免使用它。
我做错了什么?
每当按下 UIViewController
时,导航项(左、中、右)都会被替换。
如果 UIViewController
没有设置自定义项(左、中、右),导航控制器将推送默认项。
在您的情况下,您可以做的是,在 UINavigationController
中实现 UINavigationControllerDelegate
并实现此方法 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
的内容(然后视图控制器可以添加自己的按钮),例如:
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];
但是,当从 UINavigationController
调用 pushViewController
时,显示的 UINavigationItem
被设置为默认值,其标题等于场景名称。
[self pushViewController:viewController animated:NO];
无需调用 pushViewController
我就能看到我的自定义 UINavigationItem
。
问题可能是:
我正在使用
storyboard
实例化视图控制器:UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier: screen];
我应该使用
[self presentViewController:viewController animated:NO completion:nil]
而不是push
,但是,这种方法完全隐藏了导航栏解决方法可能是只显示
UIView
,但我宁愿暂时避免使用它。
我做错了什么?
每当按下 UIViewController
时,导航项(左、中、右)都会被替换。
如果 UIViewController
没有设置自定义项(左、中、右),导航控制器将推送默认项。
在您的情况下,您可以做的是,在 UINavigationController
中实现 UINavigationControllerDelegate
并实现此方法 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];
}
}