无法设置我的 iOS 的 NavigationItem

Can not set my iOS's NavigationItem

我有一个 NavigationController(nv 的缩写)和一个 ViewController(vc 的缩写)。

nv 的根ViewController 是vc。

我的目标

我只是想设置 NavigationItem ,我希望左栏按钮成为后退按钮(自定义)。因为这个左按钮在所有 ViewController 中共享,所以我不想编写代码在 ViewController ,否则我要写很多次。而且我不能只 subclass 一个 ViewController,因为我只需要几个 ViewController.

中的自定义左栏项目

所以我尝试在我的 nv 中添加生成按钮代码,但我失败了。

结果是,只有原来的vc得到了自定义的左栏按钮。 other vc 是 push on it 都得到了默认的

我的代码

这是我的 NavigationController 代码:

- (void) viewWillAppear:(BOOL)animated{
[self createBackButton];

- (void) createBackButton{   
UIViewController* vc = [self.viewControllers lastObject];
vc.navigationItem.leftBarButtonItem = nil;
vc.navigationItem.leftBarButtonItem =
    [[UIBarButtonItem alloc]initWithTitle:@"Roll Back"
                                    style:UIBarButtonItemStyleBordered
                                    target:self
                                   action:backButtonPressedSelector];
}

但是如果我将我的 createBackButton 方法放入我的 ViewController 中,一切正常。但是我也不得不多次写这个方法。甚至像[self createBackButton]

这样的句子

看来 viewWillAppear 不是调用我的 createBackButtonMethod 的好时机

我的问题

当我推送并希望视图控制器时,以什么顺序调用下面的方法,我应该在哪里添加我的 createBackButtonMethod 以获得一些 ViewController 具有相同的左栏按钮而无需编写不必要的代码?

1、NavigationController的didload

2、NavigationController的会出现

3、ViewController(被推送的那个)的didload

4、ViewController的会出现


回答

方法调用顺序是这样的:
1、vc的didload
2、nv的didload
3、nv的会出现
4、vc的会出现
然后当我继续推 vc 时,只有
vc's didload 和 vc'didload 被重复调用。

这就是我失败的原因,因为nv的didload只会在这里被调用一次

与其写一个普通的parent class,我想到了下面这个漂亮的解决方案。

只需在 pushingViewController:method

中添加内容即可

所以我覆盖了我的 pushViewController: 方法

- (void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
viewController.navigationItem.leftBarButtonItem = nil;
viewController.navigationItem.leftBarButtonItem =
[[UIBarButtonItem alloc]initWithTitle:@"Roll Back"
                                style:UIBarButtonItemStyleBordered
                               target:self
                               action:backButtonPressedSelector];
}

尝试创建父视图控制器并从中扩展所有视图控制器并在其中添加所需的代码所有视图控制器都将拥有它

希望我理解你的问题,这个答案能帮助你解决问题,祝你好运

--> 将所有代码放在 viewcontroller 的 viewdidload 或 viewwillappear 中。

-->Viewdidload 仅在您按下控制器时调用一次,而 viewwillappear 将在任何情况下每次调用 push、pop、present、dismiss 等

--> 首先会调用viewdidload 然后调用view 才会出现