的UINavigationController pushViewController按下控制器则 “自动” 关闭它

问题描述:

在我HomeViewController'sviewDidAppear方法,我有以下代码:的UINavigationController pushViewController按下控制器则 “自动” 关闭它

- (void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    BOOL didRunBefore = [defaults boolForKey:@"didRunBefore"]; 

    if (!didRunBefore) { 
     // check to see if children already exist (previous user) 
     NSArray *children = [CoreDataHelper getObjectsForEntity:NSStringFromClass([Child class]) withSortKey:@"name" andSortAscending:YES andContext:self.managedObjectContext]; 

     if (children.count == 0) { 
      // send user to create fist child 
      UIStoryboard *storyboard = self.storyboard; 

      ChildEditTableViewController *editController = [storyboard instantiateViewControllerWithIdentifier:@"ChildEditControllerID"]; 

      NSManagedObjectContext *newContext = [[NSManagedObjectContext alloc] init]; 
      newContext.parentContext = self.managedObjectContext; 
      editController.managedObjectContext = newContext; 

      [self.navigationController pushViewController:editController animated:NO]; 
     } 
    } 
} 

下面是viewDidLoad中在ChildEditTableViewController代码:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"Child Edit controller loaded"); 

    self.availablePicker.delegate = self; 
    self.bankedPicker.delegate = self; 

    self.carryOverCellIsShowing = NO; 

    self.isNewChild = self.child == nil; 

    self.imageButton.layer.cornerRadius = self.imageButton.frame.size.width/2; 
    self.imageButton.layer.masksToBounds = YES; 
    [[self.imageButton imageView] setContentMode: UIViewContentModeScaleAspectFill]; 

    if (self.isNewChild) { 

     // check to see if it's user's first time running app 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     BOOL didRunBefore = [defaults boolForKey:@"didRunBefore"]; 

     if (!didRunBefore) { 
      // hide Home back button 
      [self.navigationItem setHidesBackButton:YES]; 

      // update didRunBefore to yes 
      [defaults setBool:YES forKey:@"didRunBefore"]; 
      [defaults synchronize]; 
     } 

     self.child = [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:self.managedObjectContext]; 
     self.title = NSLocalizedString(@"Add New", @"Add New Title"); 
    } 
    else { 
     if (self.child.profileImage != nil) { 

      [self.imageButton setImage:[UIImage squaredImageFromImage:[UIImage imageWithData:self.child.profileImage] scaledToSize:self.imageButton.frame.size.height] forState:UIControlStateNormal]; 
     } 
     self.name.text = self.child.name; 

     self.autoBankSwitch.on = [self.child.autoBank boolValue]; 
     self.carryOverSwitch.on = ![self.child.resetDailyTotal boolValue]; 

     [self setCarryOverSwitchVisibility:self.autoBankSwitch]; 
    } 

    // This will remove extra separators from tableview 
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 
} 

该代码工作罚款据我看到在屏幕上加载ChildEditTableViewController,但然后它会自动弹回到家庭控制器。我已经检查了子控制器中的代码,并且只有当用户点击按钮时,才弹出控制器。

这里是保存IBAction为在那里我弹出控制器:

- (IBAction)save:(UIBarButtonItem *)sender { 

    [self saveToDB:sender]; 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

如果我使用self.navigationController setViewControllers代替,这并没有发生,ChildEditTableViewController撑装载在屏幕上,但点击保存按钮(弹出视图控制器)没有做任何事情。

任何想法? (谢谢!)

****编辑***** 我注意到它在iOS 7.1和7.03中工作正常。从UI透视唯一的区别是该片的下面的代码:

// enable handling of push notifications 
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { 
    // use registerUserNotificationSettings 
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge 
                         |UIRemoteNotificationTypeSound 
                         |UIRemoteNotificationTypeAlert) categories:nil]; 
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; 
} else { 
    // use registerForRemoteNotifications 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 
} 

在iOS 8的我得到一个提示,以允许在模拟器上通知(一些不上在之前的版本的SIM工作)。点击确定后,EditChild控制器会弹出。所以,我在应用程序委托注释掉的代码和控制器处于加载就像在iOS的7

****** EDIT ****** 下面是ApplicationDidBecomeActive代码

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 


    // move user to home screen so app is locked each time they open it (but not on first use) 

    SWRevealViewController* revealController = (SWRevealViewController*)self.window.rootViewController; 
    UINavigationController *nav = (UINavigationController *)revealController.frontViewController; 

    [nav popToRootViewControllerAnimated:YES]; 
} 

所以这是罪魁祸首。这个代码在用户点击通知注册提醒中的接受之后再次被调用,出于某种疯狂的原因。

+0

您发布的代码没有问题,所以您的问题必须在ChildEditTableViewController中。此外,您的最后一行没有意义 - 控制器未被按下并不重要。如果你设置了viewControllers(假设你已经传递了ChildEditTableViewController),那么它会将控制器添加到堆栈中,并且应该能够弹出最前面的那个,就好像你已经把它放在第一位一样。 在故事板中是否有任何可能会干扰的细分?你应该从viewDidLoad和viewDidAppear为ChildEditTableViewController发布代码。 – rdelmar 2014-10-22 04:38:08

+0

我添加了ViewDidLoad代码并更新了我的最后一行来描述我所看到的行为,因为我不知道发生了什么,并且我的假设是错误的。我没有覆盖viewDidAppear。谢谢。 – Rod 2014-10-22 04:51:12

+0

我也没有看到任何错误,所以我没有想法。 – rdelmar 2014-10-22 05:02:52

我在想你的应用程序委托中的回调正在为你的视图/控制器层次结构做些什么。我会在应用程序委托方法applicationWillResignActive中添加一些断点:applicationDidBecomeActive:并查看它们是否正在执行任何操作。