从UINavigationController中控制UINavigationItem内容

问题描述 投票:1回答:1

我试图以编程方式从UINavigationItem中心位置(视图控制器可以添加自己的按钮)为整个应用程序设置UINavigationController的内容,例如:

viewDidLoadUINavigationController方法:

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

问题可能是:

  1. 我正在使用storyboard来实例化视图控制器:UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier: screen];
  2. 而不是push我应该使用[self presentViewController:viewController animated:NO completion:nil],但是,这种方法完全隐藏了导航栏
  3. 一个解决方法可能只是提出UIView,但我宁愿现在避免它。

我在这做错了什么?

ios objective-c uinavigationcontroller uinavigationbar uibarbuttonitem
1个回答
1
投票

每当推动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];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.