【问题标题】:navigationController.viewControllers Works differently in iOS 8.2navigationController.viewControllers 在 iOS 8.2 中的工作方式不同
【发布时间】:2015-04-06 10:12:53
【问题描述】:

在我的项目中,我使用了一些代码来处理后退按钮,如下所示。

NSMutableArray *VCs = [NSMutableArray arrayWithArray: self.navigationController.viewControllers];
if ([[VCs objectAtIndex:[VCs count] - 2] isKindOfClass:[LoginViewController class]])
{
    [VCs removeObjectAtIndex:[VCs count] - 2];
    [VCs removeObjectAtIndex:[VCs count] - 2];
}
[self.navigationController setViewControllers: VCs];

在 iOS 7 中,我得到了想要的结果。但是对于 iOS 8.2 版本,可变数组 VCs 中的值只是堆栈中的 current 或 topViewController。但是后退按钮会将您导航到所有以前的视图控制器。但是导航堆栈中没有一个。ios8中的导航处理有什么变化吗?

我想从堆栈中删除登录屏幕视图控制器,以便在单击后退按钮时不会返回登录屏幕。我仅在 iOS 8.2 中遇到此问题(可能在 iOS 8 及更高版本中)。可能是什么问题?

编辑:

prepareForSegue:中,我使用了以下代码:

if([[segue identifier] isEqualToString:@"mediaDetailSegue1"])
{
    MovieDetailViewController *movieDetail;
    if(isIOS8SystemVersion)
    {
        movieDetail = ([[segue destinationViewController]viewControllers][0]);
    }
    else
    {
        movieDetail = [segue destinationViewController];
    }

        movieDetail.videoData = [_mediaContentArray objectAtIndex:selectedIndex];
    }

所以对于大于 8 的 iOS 版本,代码

 movieDetail = ([[segue destinationViewController]viewControllers][0]);

被调用。我认为这是造成问题的原因。我做错了吗?

【问题讨论】:

  • 您是否在两个操作系统版本和相同的测试场景中记录了阵列?
  • 是的。在我的 iphone 4s 和 ios 7.2 中,所有的 viewControllers 都在显示。但是当我用 ios 8.2 连接一个 iphone 5s 时,数组 conunt 是一个。只有 topViewcontroller 在数组中。但是后退按钮会将您导航到所有以前的视图控制器。但是导航堆栈中都不存在它们。ios8中的导航处理是否有任何变化?
  • 相当大的错误,如果是的话。你还有其他修改堆栈的代码吗?
  • 是的..但只有当视图控制器数组的计数>4时才会进行修改..但在所有情况下,计数都是1..即使我们直接进入这个视图。
  • 您显示的附加代码并没有改变任何东西,只是引用了一个控制器,但有趣的是它只有 8 个 - 为什么层次结构不同?还有什么其他8个具体逻辑?

标签: ios objective-c uiviewcontroller uinavigationcontroller


【解决方案1】:

我知道我的导航堆栈只有一个 viewController 的原因。 在iOS8及以上,如果我们通过第二个VC的navigationController从一个viewController到第二个viewController的segue,那么第二个VC的navigationStack将只包含topViewController。

我尝试创建一个示例项目。如果segue是从VC直接到第二个VC,那么VC2的导航堆栈将包含VC1和VC2。如果segue是通过VC2的导航控制器,那么导航堆栈的VC2 将只包含 VC2。iOS8 的奇怪行为。

在这两种情况下,应用程序在 ios 7 中的行为相似。不知道为什么它在 ios8 中表现得很奇怪

【讨论】:

  • 你能再解释一下吗?
【解决方案2】:

我正在尝试使用 iOS 8.2。 self.navigationController.viewControllers 返回堆栈中的所有视图控制器。没有这样的问题。我不确定你为什么会遇到这样的问题。

尝试使用此代码。它对我来说很好。

NSMutableArray *VCs = [NSMutableArray arrayWithArray: self.navigationController.viewControllers];

for(int i = 0; i < VCs.count; i++)
{
    UIViewController *vc = VCs[i];
    if ( [vc isKindOfClass:[LoginViewController class]])
    {
        [VCs removeObjectAtIndex:i];
    }

[self.navigationController setViewControllers: VCs];

【讨论】:

  • 感谢您的宝贵时间,但 self.navigationController.viewControllers 一次只包含一个 Vc(iOS8)..我的逻辑在 iOS 7 上运行良好。
  • 你是通过导航控制器还是直接到viewController使用segues?
  • 我知道原因了,如果你需要,看看答案。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2014-08-01
  • 2015-05-27
  • 2015-05-18
  • 2018-12-22
  • 2021-03-16
相关资源
最近更新 更多