我对UINavigationController有一个奇怪的问题。
我写了一个应用程序来显示三个级别的数据。 (RootView:选择数据I,第二视图:选择数据II,第三视图:显示数据)。这很好用,没问题。
当PushMessage到达时出现问题:在这种情况下,我正在尝试手动创建一个viewController堆栈,使用方法setViewControllers:animated:UInavigationController:
我正在初始化三个视图控制器(包含数据,标题等)并将它们添加到数组中。 此数组传递给上述方法(setViewCOntrollers),并正确显示顶部ViewController的视图。 但是当用户触摸左上角的后退按钮时,应用程序崩溃了。此Button的标题是堆栈中前一个ViewController的标题,因此堆栈似乎是正确的。 只有在接收推送通知时显示rootViewController的视图(这意味着调用setViewControllers方法)时才会发生此错误。
我的代码:
EMASubstituteTeacherScheduleAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
UINavigationController *navController = [appDelegate viewController];
MainViewController *main = [[MainViewController alloc] initWithNibName: @"MainViewController" bundle: nil];
main.navigationItem.title = @"Test";
FormViewController *formSelect = [[FormViewController alloc] initWithNibName: @"FormViewController" bundle: nil];
formSelect.navigationItem.title = @"Test (Level 2)";
formSelect.substDate = [pushData objectForKey: @"date"];
SubstitutesViewController *substDisplay = [[SubstitutesViewController alloc] initWithNibName: @"SubstitutesViewController" bundle: nil];
substDisplay.navigationItem.title = @"Test (Top)";
substDisplay.substDate = [pushData objectForKey: @"date"];
substDisplay.substForm = [pushData objectForKey: @"form"];
NSArray *controllers = [[NSArray alloc] initWithObjects: main, formSelect, substDisplay, nil];
[navController setViewControllers: controllers animated:YES];
控制台显示的消息: 程序接收信号:“EXC_BAD_ACCESS”。
调用堆栈:
'#0 0x3433886c in objc_msgSend'
'#1 0x3061a828 in -[UIApplication sendAction:to:from:forEvent:]
'#2 0x3061a7c8 in -[UIApplication sendAction:toTarget:fromSender:forEvent:]
'#3 0x3061a79a in -[UIControl sendAction:to:forEvent:]
'#4 0x3061a4ec in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
'#5 0x3061ab3a in -[UIControl touchesEnded:withEvent:]
'#6 0x306194ec in -[UIWindow _sendTouchesForEvent:]
'#7 0x30618e66 in -[UIWindow sendEvent:]
'#8 0x30614b5a in -[UIApplication sendEvent:]
'#9 0x30614506 in _UIApplicationHandleEvent
'#10 0x3323a146 in PurpleEventCallback
'#11 0x3293daaa in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
'#12 0x3293f84e in __CFRunLoopDoSource1
'#13 0x3294062c in __CFRunLoopRun
'#14 0x328e98ea in CFRunLoopRunSpecific
'#15 0x328e97f2 in CFRunLoopRunInMode
'#16 0x332396ee in GSEventRunModal
'#17 0x3323979a in GSEventRun
'#18 0x305be2a6 in -[UIApplication _run]
'#19 0x305bce16 in UIApplicationMain
'#20 0x00002512 in main at main.m:14
提前致谢!
答案 0 :(得分:0)
我假设您在主线程中进行了用户界面更新。
有一次,当我尝试将视图控制器从一个导航堆栈放到另一个导航堆栈时,导航崩溃。似乎我试图设置为另一个导航堆栈的视图控制器当前不能拥有父级。
当推送通知进入时,您的MainViewController是navigationController的rootViewController吗?如果是这种情况,当您尝试将MainViewController手动放入导航堆栈时,框架可能不喜欢它。在放入数组以设置viewControllers之前,您可能需要首先从导航堆栈中删除mainViewController。一个解决方法是将一个虚拟viewController作为rootViewController,以便在新的导航堆栈上使用viewController之前,可以使用popToRootViewController从堆栈中轻松删除实际的根ViewController。
这是一个从你的问题中找到我的想法。您的情况可能与我遇到的情况相同或不同。
答案 1 :(得分:0)
有同样的问题,用这个解决了:
@interface MyNavController ()
@property (nonatomic, strong) NSDate* setVCDate;
@end
- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
{
if ( self.setVCDate == nil || [[NSDate date] timeIntervalSinceDate:self.setVCDate] > 1.0 ) {
[super setViewControllers:viewControllers animated:animated];
self.setVCDate = [NSDate date];
} else {
DLog(@" ***** [UINavigationController setViewControllers:animated: called too fast, ignoring until Apple will fix their s###");
}
}