[CustomNavigationController popToViewController:transition:]中的断言失败

时间:2014-12-10 11:10:33

标签: objective-c xcode ios7 uinavigationcontroller

我希望弹出视图控制器,直到所需的视图控制器位于导航堆栈的顶部。

我这样做:

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]: 我不清楚,我不需要如何弹出到根视图控制器,我需要一种方法如何弹出多个视图控制器。以上只是一个从SecondViewControllerMainViewController

的示例

更新[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
)

3 个答案:

答案 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(在您的情况下,您将获取原始堆栈的子数组),然后将其转储回导航控制器。