我需要在视图控制器之间跳转。例如:
View1: First screen (Just logo)
View2: Download Screen
View3: First app screen (Some Buttons)
View4-View(N): some app screens
当用户输入应用时,应用会转到View1-> View2(下载内容) - >查看3-> View4-> View5 然后用户希望转到第一个应用程序屏幕(View3),他执行:
NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:NO];
用户第一次进入应用程序时:View1-> View3(不再需要下载屏幕),我有不同的推送segue转到View3所以我们假设用户转到:View1->查看3-> View4-> View5,现在他希望回到View3,所以功能:
NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:NO];
将他送回View4,这是错误的。我该如何解决?
答案 0 :(得分:2)
如果您使用的是故事板,那么您可以做的就是设置您的uiviewcontrollers'故事板ID,用它来弹出和推动你的观点。
让我们说你的故事板名称是MainStoryboard.storyboard
UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
SettingsListViewController *settingsVC = [sb instantiateViewControllerWithIdentifier:@"SettingsListViewController"]; // @"SettingsListViewController" is the string you have set in above picture
[self.navigationController popToViewController:settingsVC animated:YES];
以上解决方案应该适合你,但如果我是你,我会改变我的应用程序的结构,你说:
View1: First screen (Just logo)
View2: Download Screen
由于View1只是徽标而View 2也是您跳过的视图,因此您可以将其从导航控制器中删除,并将View3作为导航控制器的root view controller
,当您需要view1和view2 {{ 1}},
当你完成它们时,我们可以说;用户成功加载应用程序关闭徽标屏幕,present them as Modal View Controllers
如果下载成功则解除它。
所以你的View3将作为root视图控制器存在,让我们说你想在View(n)你想要进入主屏幕View3所有你需要做的就是打电话
present Download Screen
当您在[self.navigationController popToRootViewControllerAnimated:NO];
时,想要弹出view(n)
只需使用
view(n-1)
祝你好运,
答案 1 :(得分:0)
根据你的引用直接使用viewController的名称
创建viewController的实例,就像这样 我认为你的viewController名称是-view3Controller
View3Controller view3Controller=[[View3Controller alloc]init];
[self.navigationController popToViewController:@"view3Controller" animated:NO]
或者如果您使用的是故事板,那么
View3Controller view3Controller=[self.storyboard instantiateViewControllerWithIdentifier:@"view3Controller"];
[self.navigationController popToViewController:@"view3Controller" animated:NO]
答案 2 :(得分:0)
在第二个序列中,您的导航堆栈会更改,而view3将在索引1处。
[[self.navigationController popToViewController:[array objectAtIndex:1] animated:NO];
将是正确的做法。
答案 3 :(得分:0)
听起来View 2在运行时没有添加到视图控制器数组中,可能是因为你创建了segue。
尝试删除从视图1转换的segue>在没有动画的情况下,查看3并将用户推过View 2,因为您的应用程序的逻辑需要它:
// If the user needs to skip ahead to view 3, conditionally push view 2 and view 3 without animating
[self.navigationController pushViewController:viewController2 animated:NO];
[self.navigationController pushViewController:viewController3 animated:NO];
或者,如果您将segue留在原位,您是否可以不查看UINavigationController
viewControllers
属性的大小,并根据大小“猜测”是否跳过View 2?如果您这样做,则可以调整popToViewController
方法以弹出正确的索引。如果您还需要跳过其他观点,这可能不那么优雅和脆弱。
// Check length of viewController array with 'N' views (pseudo code)
if (self.navigationController.viewControllers.length == N-1)
// View 2 was ignored: pop to objectAtIndex:1
else
// View 2 was included: pop to objectAtIndex:2
答案 4 :(得分:0)
如果我理解正确,你的view3有特殊的视图控制器,所以你可以使用这样的代码:
NSArray *VCs = [self.navigationController viewControllers];
for (UIViewController *VC in VCs)
{
if ([VC isKindOfClass:[**YOUR-VIEW-CONTROLLER** class]]) {
[self.navigationController popToViewController:VC animated:NO];
}
}
这很简单,有效!
答案 5 :(得分:0)
我总是使用它,它会在你的情况下正常工作。实际上,以下代码行被复制到我的" Notes"用于快速复制/粘贴。
如果没有,请务必导入ViewController.h文件。
for (UIViewController *viewController in self.navigationController.viewControllers) {
if([viewController isKindOfClass:["your ViewController" class]]) {
[self.navigationController popToViewController:viewController animated:NO];
}
}
答案 6 :(得分:0)
for (UIViewController* controller in self.navigationController.viewControllers) {
if ([controller isKindOfClass:[<Your View Controller Name> class]]) {
[self.navigationController popToViewController:controller animated:YES];
return;
}
}
答案 7 :(得分:-1)
像这样对待特定的视图控制器
[self.navigationController popToViewController:[[self.navigationController viewControllers]objectAtIndex:1] animated:YES];