Intereting Posts
Поток zip-файла из приложения iOS в веб-браузер что делает класс метода в объективе c Отладка, почему SKScene init (fileNamed :) возвращает nil iPhone Safari: почему запрос геолокации появляется дважды? Почему значение range.length изменяется для backspace в методах делегатов ifChangeCharactersInRange? Получить iOS-камеру для вывода значений с плавающей запятой в Swift 2 Передача данных в ViewController с помощью кнопки «Назад» Автоответчик для обмена сообщениями в SDK Facebook на IOS 11 PhoneGap / Cordova Barcodescanner плагин для iPhone / iOS Изменение размера ширины содержимого UITableViewCell. Что такое общая однопользовательская база данных для разработки Mac OSX? Как создать панель вкладок в iOS? iOS: лучший способ борьбы с глобальными свойствами Показать только учебное пособие Преобразование приложения из оплачиваемой покупки в приложении? Как узнать, какие пользователи заплатили?

UINavigationController pushViewController толкает контроллер, затем «автоматически» отклоняет его

В моем HomeViewController's viewDidAppear меня есть следующий код:

 - (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 на экране, но затем он автоматически возвращается к домашнему контроллеру. Я проверил код в дочернем контроллере и единственный раз, когда я выхожу на контроллер, когда пользователь нажимает кнопку.

Вот Save IBAction, где я выхожу на контроллер:

 - (IBAction)save:(UIBarButtonItem *)sender { [self saveToDB:sender]; [self.navigationController popViewControllerAnimated:YES]; } 

Если я использую self.navigationController setViewControllers , этого не произойдет, и ChildEditTableViewController останется загруженным на экране, но нажатие кнопки «Сохранить» (которое появляется в контроллере представления) ничего не делает.

Есть идеи? (Благодаря!)

**** EDIT ***** Я заметил, что он отлично работает в iOS 7.1 и 7.03. Единственным отличием от перспективы пользовательского интерфейса был следующий фрагмент кода:

 // 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 я получал приглашение разрешить уведомления на симуляторе (что-то, что не работает на симе в предыдущих версиях). После того, как я щелкнул ok, когда контроллер 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]; } 

Так что это преступник. Этот код снова вызывается сразу после того, как пользователь нажимает кнопку «Принять» в уведомлении о регистрации уведомлений по какой-то сумасшедшей причине.

Я думаю, что обратные вызовы в делетете приложения делают что-то для вашей иерархии view / controller. Я бы добавил некоторые точки останова в ваших методах делегирования приложения applicationWillResignActive :, applicationDidBecomeActive: и посмотреть, делают ли они что-либо.