通过弹出导航控制器或使用选项卡栏来识别是否访问视图控制器的更好方法



尝试澄清:我希望能够区分以下两种情况:

视图
  • 控制器的视图由于弹出而变为活动状态。
  • 视图
  • 控制器的视图由于选项卡栏导航而变为活动状态

在我正在开发的应用程序中,我需要知道视图控制器是否由于其导航控制器被弹出而呈现。我看了这篇文章,认为我已经找到了解决方案,只需调用:

BOOL wasReachedByPopping = !self.isMovingToParentViewController;

在我的viewWillAppear:方法

这在大多数情况下都工作正常,但不幸的是,当通过 tabBarController 切换导航控制器时会给出误报。我一直在考虑向我的视图控制器添加一个名为pushedNewController的BOOL,该将在推送之前设置为YES。

self.pushedNewController = YES; // whenever I plan to push

这应该可以正常工作,但我真的很不高兴不得不将其建立在像持久 BOOL 状态这样混乱的东西上。任何人都有更好的方法来识别视图控制器是否通过弹出器到达?


编辑:我很欣赏下面的努力,但似乎它们只是提供了与我已经拥有的完全相同的功能。没有方法可以区分通过选项卡栏导航弹出或移动到。似乎我将不得不确定一个内部 BOOL 来存储视图控制器是否请求推送。我通过以下方式设置它,供任何感兴趣的人使用:

- (void)viewDidDisappear:(BOOL)animated{
self.disappearedDueToPush = (self != [self.navigationController.viewControllers lastObject]);
}

你有没有看过UINavigationControllerDelegate方法:

– navigationController:willShowViewController:animated:
– navigationController:didShowViewController:animated:

当视图控制器被推入或弹出导航堆栈时,将调用这些控件。

有关详细信息,请参阅 Apple 文档。

您需要UINavigationControllerDelegate,具体来说,didShowViewController:方法。下面是一个使用示例:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (viewController == self) {
NSLog(@"%@",viewController);
}
}

如果条件是否弹出视图控制器,您可以使用它!!

if ([self.navigationController.viewControllers indexOfObject:viewControllerObj] == NSNotFound)
{
[self.navigationController pushViewController:viewControllerObj animated:YES];
}
else
{
[self.navigationController popToViewController:viewControllerObj animated:YES];
}

试试这个...

if ([self.navigationController.viewControllers containsObject:<Your View Controller>])
{
NSLog(@"It is Pushed");
}
else
{
NSLog(@"It is Poped");
}

因此,回顾一下,除了存储推送作为状态执行的事实之外,似乎没有办法。从下面提供的答案来看,可以通过实现UINavigationControllerDelegate并使用navigationController:willShowViewController:animated:方法来设置此状态:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
self.disappearedDueToPush = !(viewController == self);
}

如果实现委托似乎有点沉重(它对我确实如此),您可以在 viewDidDisappear 方法中改为以下内容:

if (self != [self.navigationController.viewControllers lastObject]){
self.disappearedDueToPush = YES;
}

这对我来说更有意义,因为反向逻辑(并检查事实)是在 viewWillSeem 方法中执行的。

最新更新