rickytan / RTRootNavigationController

Implicitly make every view controller has its own navigation bar
MIT License
2.15k stars 379 forks source link

在首次push时添加的左上角返回按钮不生效 #233

Closed SabinLee closed 6 years ago

SabinLee commented 6 years ago

我有一个自定义导航控制器继承自RTRootNavigationController, 现在我的需求是导航控制器initWithRootVC后左上角自动加一个返回按钮, 我在我继承的这个vc是这样写的

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
    // 当push这个子控制器时, 隐藏底部的工具条
    if (self.viewControllers.count > 0) {
        viewController.hidesBottomBarWhenPushed = true;
        viewController.rt_disableInteractivePop = NO;
    }
    UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 40)];
    UIImageView *bgImg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 10, 11, 20)];
    bgImg.image = [UIImage imageNamed:@"img_back_orange"];
    [backButton addSubview:bgImg];
    [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    // 将viewController压入栈中
    [super pushViewController:viewController animated:animated];
}

但是左上角返回按钮没加上, 我看了一下, super里面是有个判断, 难道我就不能在navVC初始化并首次push的时候给vc添加返回吗?

rickytan commented 6 years ago

在你的 vc 中重写 rt_customBackBarButtonItem 方法就好,不需要继承此类。

另外,使用 0.6.x 版,0.7 目前有问题

SabinLee commented 6 years ago

rt_customBackBarButtonItem

您好! 我现在在tabbar控制器初始化时不使用我继承的导航vc, 而直接使用RTRootNavVC, 在个人中心首页使用rt_customBackBarButtonItem 仍然不起作用, 但是在个人中心点击push后的页面就生效, 也就是栈底控制器总是不生效, 这是为什么呢? 相关代码如下:

//初始化tabbarVC
[tabbarVC addChildViewControllerWithChildVC:[[RTRootNavigationController alloc] initWithRootViewController:[[PersonalViewController alloc] init]] title:@"我的" normalImage:@"personal_normal" selectedImage:@"personal_selected"];

//PersonalViewController内部: (实现方法, 左上角无按钮)
-(UIBarButtonItem *)rt_customBackItemWithTarget:(id)target action:(SEL)action{
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
    btn.backgroundColor = [UIColor redColor];
    return [[UIBarButtonItem alloc] initWithCustomView:btn];
}

//PersonalViewController内, [self.navvc pushvc1], vc1内实现方法, 左上角有红色按钮
SabinLee commented 6 years ago

在你的 vc 中重写 rt_customBackBarButtonItem 方法就好,不需要继承此类。

另外,使用 0.6.x 版,0.7 目前有问题

麻烦回复一下, 谢谢了, 而且我目前是换了0.67版本

SabinLee commented 6 years ago

@rickytan 能看见我的@吗?

rickytan commented 6 years ago

addChildViewControllerWithChildVC: 这个方法你自己的?使用

tabbarVC.viewControllers = @[vc];
SabinLee commented 6 years ago

addChildViewControllerWithChildVC: 这个方法你自己的?使用

tabbarVC.viewControllers = @[vc];

经测试, 也加不上. 目前发现只发现一个能给栈底控制器加返回按钮的方法 image 还有个疑问就是, 如果不继承自rt导航控制器, 如何统一添加管理返回按钮和返回手势?难道每个vc都写一遍吗或者要普通vc来继承一个基类?

rickytan commented 6 years ago

有没有设置 useSystemBack ?

SabinLee commented 6 years ago

useSystemBack

没有,从头到尾就没用这个属性

rickytan commented 6 years ago

demo 程序跑起来没问题吧,对比下吧。没有你的代码只能盲猜

SabinLee commented 6 years ago

demo 程序跑起来没问题吧,对比下吧。没有你的代码只能盲猜

demo是没问题的, 而且demo里面也没有这种尝试. 所以我一直在问的两个问题就是 1.如何给栈底控制器加自定义返回按钮?(我只有一个可行的方法, 在上面的截图) 2.如何统一管理这个返回按钮, 比如我每次push进去就设置一个默认的自定义返回按钮(我现在是用继承, 拦截push) 能回答我一下吗

rickytan commented 6 years ago

第一个问题,你指的是 navigation 中的第一个 VC ?它为什么要加返回按钮?这种情况你只能自己设置一个 leftBarButtonItem 第二个问题,在 UIViewController 的任何 category 中实现 rt_customBackBarButtonItem 方法即可。你这里不生效的话,放个 demo 上来,感觉是层级关系或者使用方式不太对

SabinLee commented 5 years ago

第一个问题,你指的是 navigation 中的第一个 VC ?它为什么要加返回按钮?这种情况你只能自己设置一个 leftBarButtonItem 第二个问题,在 UIViewController 的任何 category 中实现 rt_customBackBarButtonItem 方法即可。你这里不生效的话,放个 demo 上来,感觉是层级关系或者使用方式不太对

OK, 没有其他问题了,感谢指教!