gpt4 book ai didi

iphone - 使用 setViewControllers 时 UINavigationController 导致应用程序崩溃

转载 作者:行者123 更新时间:2023-12-02 06:15:51 27 4
gpt4 key购买 nike

我的 UINavigationController 有一个奇怪的问题。

我编写了一个应用程序来显示三个级别的数据。 ( Root View :选择数据 I,第二 View :选择数据 II,第三 View :显示数据)。这很好用,没有问题。

当 PushMessage 到达时就会出现问题:在这种情况下,我尝试使用 UINavigationController 的 setViewControllers:animated: 方法手动创建 viewController Stack:

我正在初始化三个 View Controller (包含数据、标题等)并将它们添加到数组中。该数组被传递给提到的方法(setViewCOntrollers),并且顶部ViewController的 View 正确显示。但是当用户触摸左上角的后退按钮时,应用程序崩溃了。这个Button的Title是堆栈中前一个ViewController的Title,所以堆栈看起来是正确的。仅当收到推送通知(即调用 setViewControllers 方法)时显示 rootViewController 的 View 时,才会出现此错误。

我的代码:

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

提前致谢!

最佳答案

我假设您在主线程中进行用户界面更新。

有一次,当我尝试将 View Controller 从一个导航堆栈放到另一个导航堆栈时,导航发生了崩溃。看来我试图设置到另一个导航堆栈的 View Controller 当前不能有父级。

当推送通知到来时,你的MainViewController是navigationController的rootViewController吗?如果是这种情况,当您尝试手动将 MainViewController 放入导航堆栈时,框架可能会不喜欢它。在放入数组中设置 viewController 之前,您可能需要先从导航堆栈中删除 mainViewController。一种解决方法是使用一个虚拟 viewController 作为 rootViewController,以便在新的导航堆栈上使用该 viewController 之前,您可以使用 popToRootViewController 轻松地从堆栈中删除实际的根 ViewController。

这是我从你的问题中想到的一个想法。您的情况可能与我遇到的情况相同,也可能不同。

关于iphone - 使用 setViewControllers 时 UINavigationController 导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3542023/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com