UITabBarController应用程序和pushViewController失败

cro*_*dor 2 iphone objective-c uitabbarcontroller uinavigationcontroller ios

我创建了一个TabBarController包含三个ViewControllers内部的应用程序UINavigationControllers,A,B和C.我已经以编程方式创建了所有内容.现在我想在其中一个TabBar项目中推送一些ViewControllers.

例如,如果我在ViewController B中,我按下一个按钮,我想将一个pushViewController转换为ViewController:D,如果我按下DI中的新按钮想要转到一个新的ViewController E.并且每当我想要的时候我应该可以回到NavigationController后退按钮.

问题是当我尝试从D回到B时,我在D和B之间有一个新的空ViewController,我得到这个错误:

首先,我在B并按下NEXT按钮到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>.
Run Code Online (Sandbox Code Playgroud)

这里的应用程序不会崩溃.

第二,我在D,我想回到B(通过导航栏中的backButton):

我第一次按下后退按钮会出现一个空的viewController,在导航栏中有新的后退按钮(在D和B之间).然后我按下新的BackButton并且app崩溃并出现此错误:

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
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

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;
}
Run Code Online (Sandbox Code Playgroud)

BViewController代码:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

rde*_*mar 5

您的问题是使用UIControlEventAllTouchEvents作为addTarget:action:forControlEvents:方法中的参数.这导致"下一个"方法被调用两次.将其更改为UIControlEventTouchUpInside,它应该可以正常工作.