我有一个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:方法
- (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];
}
答案 0 :(得分:0)
尝试制作父视图控制器并从中扩展所有视图控制器,并在其中添加所需的代码,所有视图控制器都将拥有它
希望我理解你的问题,这个答案可以帮助你解决问题好运
答案 1 :(得分:0)
- >将所有代码放在viewcontroller的viewdidload或viewwillappear中。
- > Viewdidload仅在您按下控制器时调用一次,并且viewwillappear将在每次调用时调用push,pop,present,dismiss等。
- >首先会调用viewdidload然后调用view会出现。