我希望弹出视图控制器,直到所需的视图控制器位于导航堆栈的顶部。
我这样做:
UIViewController *aViewController = [self.navigationController.viewControllers objectAtIndex:lViewControllerIndex];
[self.navigationController popToViewController:aViewController
animated:YES];
从调试器我可以看到aViewController
是<MainViewController: 0x79ea3b10>
和self.navigationController.viewControllers
是
<MainViewController: 0x79ea3b10>,
<FirstViewController: 0x79eb2630>,
<SecondViewController: 0x7b258f10>
目前我在SecondViewController
,我想回到MainViewController
但它崩溃了,崩溃消息如下:
***** Assertion failure in -[CustomNavigationController popToViewController:transition:], /SourceCache/UIKit_Sim/UIKit-2935.137/UINavigationController.m:4912**
如何通过弹出多个视图控制器来正确返回?
更新[1]:
我不清楚,我不需要如何弹出到根视图控制器,我需要一种方法如何弹出多个视图控制器。以上只是一个从SecondViewController
到MainViewController
更新[2]:
堆栈追踪:
0 CoreFoundation 0x030a81e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x02e218e5 objc_exception_throw + 44
2 CoreFoundation 0x030a8048 +[NSException raise:format:arguments:] + 136
3 Foundation 0x00c7d4de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4 UIKit 0x01a45ab8 -[UINavigationController popToViewController:transition:] + 918
5 UIKit 0x01a4571d -[UINavigationController popToViewController:animated:] + 56
6 Isi For You 0x000a14b7 -[DetailViewController breadcrumbItemPressedAtIndex:] + 327
7 Isi For You 0x000c4460 -[ListHeaderViewController breadcrumbView:didTapItemAtIndex:] + 144
8 Isi For You 0x00094772 -[BTBreadcrumbView didTapItemAtIndex:] + 162
9 Isi For You 0x0009480f -[BTBreadcrumbView tapItemButton:] + 143
10 libobjc.A.dylib 0x02e33880 -[NSObject performSelector:withObject:withObject:] + 77
11 UIKit 0x018fe3b9 -[UIApplication sendAction:to:from:forEvent:] + 108
12 UIKit 0x018fe345 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
13 UIKit 0x019ffbd1 -[UIControl sendAction:to:forEvent:] + 66
14 UIKit 0x019fffc6 -[UIControl _sendActionsForEvents:withEvent:] + 577
15 UIKit 0x019ff243 -[UIControl touchesEnded:withEvent:] + 641
16 UIKit 0x0193dddd -[UIWindow _sendTouchesForEvent:] + 852
17 UIKit 0x0193e9d1 -[UIWindow sendEvent:] + 1117
18 UIKit 0x019105f2 -[UIApplication sendEvent:] + 242
19 Isi For You 0x00434244 -[CustomUIApplication sendEvent:] + 100
20 UIKit 0x018fa353 _UIApplicationHandleEventQueue + 11455
21 CoreFoundation 0x0303177f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
22 CoreFoundation 0x0303110b __CFRunLoopDoSources0 + 235
23 CoreFoundation 0x0304e1ae __CFRunLoopRun + 910
24 CoreFoundation 0x0304d9d3 CFRunLoopRunSpecific + 467
25 CoreFoundation 0x0304d7eb CFRunLoopRunInMode + 123
26 GraphicsServices 0x042cc5ee GSEventRunModal + 192
27 GraphicsServices 0x042cc42b GSEventRun + 104
28 UIKit 0x018fcf9b UIApplicationMain + 1225
29 Isi For You 0x000449e2 main + 82
30 libdyld.dylib 0x038796d9 start + 1
)
答案 0 :(得分:3)
当您尝试弹出的视图控制器不在导航堆栈中时,通常会发生该错误。虽然在你的情况下你似乎看到控制器实际上在那里......你可以使用popToRootViewControllerAnimated:
弹出你的&#34; root&#34;。
[self.navigationController popToRootViewControllerAnimated:YES];
答案 1 :(得分:1)
如果您尝试弹出没有动画,它将起作用。当试图弹出多个视图控制器时,我遇到了这个问题。
如果你想弹出n个viewControllers直到没有动画的n-1弹出,那么用动画弹出最后一个。
答案 2 :(得分:0)
您可以使用
- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
在UINavigationController
上的API在多个堆栈位置跳转之间跳转或者实际上完全替换堆栈。
来自文档
要放置在堆栈中的视图控制器。从前到后的顺序 此数组中的控制器表示新的从下到上的顺序 导航堆栈中的控制器。因此,添加了最后一项 到数组成为导航堆栈的顶部项目。
使用viewControllers
属性恢复当前堆栈,根据需要进行mutate(在您的情况下,您将获取原始堆栈的子数组),然后将其转储回导航控制器。