问题描述
我创建了一个 TabBarController
应用程序,其中 UINavigationControllers
、A、B 和 C 三个 ViewControllers
.我以编程方式创建了所有内容.现在我想在这些 TabBar 项目之一中推送一些 ViewControllers.
I have created a TabBarController
app with three ViewControllers
inside UINavigationControllers
, A, B and C. I have created everything programmatically. Now I want to push some ViewControllers inside one of those TabBar items.
例如,如果我在 ViewController B 中按下一个按钮,我想将 pushViewController 设置为 ViewController:D,如果我按下 DI 中的新按钮,我想转到一个新的 ViewController E.只要我想,我应该可以通过 NavigationController 后退按钮返回.
For Example if I am in ViewController B and I press one button I want to make a pushViewController to ViewController: D and if I press new button in D I want to go to a new ViewController E. and whenever I want I should can get back by the NavigationController back button.
问题是当我尝试从 D 返回到 B 时,我在 D 和 B 之间有一个新的空 ViewController 并且出现此错误:
The problem is when I try to get back from D to B, I have like a new empty ViewController between D and B and I get this errors:
首先,我在 B 并按 NEXT BUTTON 到 D :
First, I am in B and press NEXT BUTTON to 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>.
在这里应用不会崩溃.
其次,我在 D 并且我想回到 B(通过导航栏中的 backButton):
Second, I am in D and I want to get back to B(by backButton in Navigation bar):
我第一次按下后退按钮时,会在导航栏中(在 D 和 B 之间)出现一个带有新后退按钮的空 viewController.然后我按下新的 BackButton 并且应用程序崩溃并出现此错误:
First time I press back button appears an empty viewController with new backbutton in Navigation Bar(Between D and B). Then I press new BackButton and app crash with this error:
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
我试过这样做:
appDelegate.m
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 代码:
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];
}
推荐答案
您的问题是使用 UIControlEventAllTouchEvents 作为 addTarget:action:forControlEvents: 方法中的参数.这导致next"方法被调用两次.将其更改为 UIControlEventTouchUpInside,它应该可以正常工作.
Your problem is using UIControlEventAllTouchEvents as the argument in the addTarget:action:forControlEvents: method. This is causing the "next" method to be called twice. Change that to UIControlEventTouchUpInside, and it should work properly.
这篇关于UITabBarController 应用程序和 pushViewController 失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!