无法设置我的iOS的NavigationItem

时间:2015-08-13 11:39:15

标签: ios objective-c iphone uinavigationcontroller uinavigationbar

我有一个NavigationController(简称nv)和一个ViewController(vc的简称)。

nv的RootViewController是vc。

我的目标

我只想设置NavigationItem,我希望左边的按钮是BACK按钮(自定义)。因为这个左按钮在所有ViewControllers中共享所以我不想在ViewController中编写代码,否则我有写多次。而且我不能只是一个ViewController的子类,因为我只需要在一些ViewController中定制左边的条形图项。

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

结果是,只有原始的vc得到了自定义左栏按钮。推进它的其他vc都是默认的。

我的代码

这是我的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的willappear

3,ViewController(正在推送的那个)的didload

4,ViewController的willappear

答案

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

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

我没有写一个共同的父类,而是考虑下面的漂亮解决方案。

只需在pushViewController: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];
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

- > Viewdidload仅在您按下控制器时调用一次,并且viewwillappear将在每次调用时调用push,pop,present,dismiss等。

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