L'application UITabBarController et pushViewController échouent

J'ai créé une application TabBarController avec trois ViewControllers dans UINavigationControllers , A, B et C. J'ai tout créé par programmation. Maintenant, je veux pousser certains ViewControllers dans l'un de ces éléments TabBar.

Par exemple si je suis dans ViewController B et j'appuie sur un button je veux faire un pushViewController à ViewController: D et si j'appuie sur le nouveau button dans DI veux aller à un nouveau ViewController E. et quand je veux je devrais pouvoir revenir par le button de return de NavigationController.

Le problème est quand j'essaye de revenir de D à B, j'ai comme un nouveau ViewController vide entre D et B et j'obtiens ces erreurs:

Premièrement, je suis en B et j'appuie sur le button SUIVANT pour D:

 2013-10-30 01:00:07.076 Wplanet[11964:70b] nested push animation can result in corrupted navigation bar 2013-10-30 01:00:07.444 Wplanet[11964:70b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 2013-10-30 01:00:07.582 Wplanet[11964:70b] Unbalanced calls to begin/end appearance transitions for <DViewController: 0x8aa7260>. 

Ici, l'application ne plante pas.

Deuxièmement, je suis en D et je veux revenir à B (par backButton dans la barre de navigation):

La première fois que j'appuie sur le button de return apparaît une vue videController avec un nouveau button de return dans la barre de navigation (entre D et B). Ensuite, j'appuie sur le nouveau BackButton et l'application plante avec cette erreur:

 2013-10-30 01:03:54.790 Wplanet[12001:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview' *** First throw call stack: ( 0 CoreFoundation 0x01ce25e4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x01a658b6 objc_exception_throw + 44 2 CoreFoundation 0x01ce23bb +[NSException raise:format:] + 139 3 UIKit 0x0083adfb -[UIView(Internal) _addSubview:positioned:relativeTo:] + 113 4 UIKit 0x0082e9b1 -[UIView(Hierarchy) addSubview:] + 56 5 UIKit 0x007c7766 __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke + 1701 6 UIKit 0x008353ef +[UIView(Animation) performWithoutAnimation:] + 82 7 UIKit 0x007c6c96 -[_UINavigationParallaxTransition animateTransition:] + 1155 8 UIKit 0x00901e4e -[UINavigationController _startCustomTransition:] + 3446 9 UIKit 0x0090e0c7 -[UINavigationController _startDeferredTransitionIfNeeded:] + 688 10 UIKit 0x0090ecb9 -[UINavigationController __viewWillLayoutSubviews] + 57 11 UIKit 0x00a48181 -[UILayoutContainerView layoutSubviews] + 213 12 UIKit 0x0083e267 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355 13 libobjc.A.dylib 0x01a7781f -[NSObject performSelector:withObject:] + 70 14 QuartzCore 0x045d52ea -[CALayer layoutSublayers] + 148 15 QuartzCore 0x045c90d4 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380 16 QuartzCore 0x045c8f40 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26 17 QuartzCore 0x04530ae6 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294 18 QuartzCore 0x04531e71 _ZN2CA11Transaction6commitEv + 393 19 QuartzCore 0x04532544 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92 20 CoreFoundation 0x01caa4ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30 21 CoreFoundation 0x01caa41f __CFRunLoopDoObservers + 399 22 CoreFoundation 0x01c88344 __CFRunLoopRun + 1076 23 CoreFoundation 0x01c87ac3 CFRunLoopRunSpecific + 467 24 CoreFoundation 0x01c878db CFRunLoopRunInMode + 123 25 GraphicsServices 0x02ee59e2 GSEventRunModal + 192 26 GraphicsServices 0x02ee5809 GSEventRun + 104 27 UIKit 0x007d3d3b UIApplicationMain + 1225 28 Woowplanet 0x0000592d main + 141 29 libdyld.dylib 0x0258a70d start + 1 30 ??? 0x00000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException 

J'ai essayé de faire ceci:

appDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // TAB BAR CONTROLLER UITabBarController *tabBarController = [[UITabBarController alloc] init]; AViewController *aVC = [[AViewController alloc] init]; // nombre tab abr controller aVC.title = @"A"; UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:aVC]; nav1.navigationBar.topItem.title = nil; BViewController *bVC = [[BViewController alloc] init]; bVC.title = @"bVC"; UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:sherpaVC]; nav2.navigationBar.topItem.title = nil; CViewController *cVC = [[CViewController alloc] init]; cVC.title = @"cVC"; UINavigationController *nav3 = [[UINavigationController alloc] initWithRootViewController:cVC]; nav3.navigationBar.topItem.title = nil; [tabBarController setViewControllers:@[nav1,nav2,nav3]]; [tabBarController setSelectedIndex:1]; self.window.rootViewController = tabBarController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } 

BViewController Code:

 - (void)viewDidLoad { [super viewDidLoad]; UILabel *titleLbl = [[UILabel alloc] initWithFrame:CGRectMake(75, 75, 200, 14)]; [titleLbl setTextColor:UIColorFromRGB(0x7B2F19)]; [titleLbl setFont:[UIFont systemFontOfSize:14]]; [titleLbl setBackgroundColor:[UIColor clearColor]]; [titleLbl setText:@"I am in Bcontroller"]; [self.view addSubview:titleLbl]; UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(75, 175, 200, 14)]; [btn setBackgroundColor:[UIColor blueColor]]; [btn setTitle:@"Next" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(next) forControlEvents:UIControlEventAllTouchEvents]; [self.view addSubview:btn]; } -(void)next { DViewController *dVC = [[DViewController alloc] init]; [self.navigationController pushViewController:dVC animated:YES]; } 

Votre problème utilise UIControlEventAllTouchEvents comme argument dans la méthode addTarget: action: forControlEvents:. Cela provoque l'appel de la méthode "next" deux fois. Changez cela en UIControlEventTouchUpInside, et cela devrait fonctionner correctement.