UINavigationController hidesBarOnSwipe内存泄漏问题

时间:2017-12-07 11:56:51

标签: ios objective-c memory-leaks uinavigationcontroller uinavigationbar

我对hidesBarOnSwipe的{​​{1}}属性有疑问。

概述:

Link to project file

我有一个名为FirstViewController的控制器,它是UINavigationController的根视图。 一切都在UINavigationController。 FirstViewController包含Main.storyboard操作。在该操作中,我实例化一个SecondViewController并将其推送到导航堆栈。

UIButton

在SecondViewController内部- (IBAction)button:(id)sender { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; [self.navigationController pushViewController:vc animated:YES]; } 上只有hidesBarsOnSwipe属性设置为YES

viewDidLoad

和dealloc获取NSLogged:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.hidesBarsOnSwipe = YES;
}

问题:

当我们向上滑动以隐藏navigationBar时,dealloc永远不会被调用。 Instruments在这里显示了SecondViewController内存泄漏。

当我们在SecondViewController上时,我们只需按下后退按钮 - 一切都很好。 Dealloc被召唤。

肯定有某种保留周期,但我不知道为什么以及如何避免这种情况。

1 个答案:

答案 0 :(得分:2)

一些更新和临时解决方案:

还有另一种执行navigationBar隐藏的方法。 对我有用的是:

[self.navigationController setNavigationBarHidden:hidden animated:YES];

要获得良好的效果,请在班级中添加一个属性以跟踪navigationBar动画的状态:

@property (assign, nonatomic) BOOL statusBarAnimationInProgress;

像这样实施UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
    if (yVelocity > 0 && !self.statusBarAnimationInProgress) {
        [self setNavigationBarHidden:NO];
    } else if (yVelocity < 0 && !self.statusBarAnimationInProgress) {
        [self setNavigationBarHidden:YES];
    }
}

隐藏设置导航栏应如下所示:

- (void)setNavigationBarHidden:(BOOL)hidden {
    [CATransaction begin];
    self.statusBarAnimationInProgress = YES;
    [CATransaction setCompletionBlock:^{
        self.statusBarAnimationInProgress = NO;
    }];
    [self.navigationController setNavigationBarHidden:hidden animated:YES];
    [CATransaction commit];
}

我使用CATransaction来检查导航栏的动画是否完成。任何有效的方式。解决方案不是那么容易,但至少没有泄漏:)