0

я реализовал приложение с горкой в ​​стилизованном меню с помощью ECSlidingViewControllerUINavigationController подкласс не вызывая willShowViewController, когда ожидаются

В настоящее время у меня есть следующие настройки: первоначального View Controller подкласс ECSlidingViewController. Это управляет нажатием контроллера верхнего уровня (основной вид, отображаемый на экране) и нижним контроллером, который является меню.

Меню представляет собой подкласс контроллера таблицы, когда нажимается щелчок на новом контроллере верхнего уровня, который помещается в стек.

В поле previous question Я использую контроллер навигации (подклассы), который содержит один контроллер корневого представления. Каждый раз, когда выбирается строка, новый экземпляр навигационного контроллера загружается с помощью другого контроллера представления, старого dealloc'd. Например:

// Check if the settings view is currently displayed if it is just reset the top view else load it to the topviewcontroller. 
       UINavigationController *navController = (UINavigationController *)self.slidingViewController.topViewController; 
       UIViewController *VC = navController.topViewController; 
       if ([VC isKindOfClass:[MESSettingsViewController class]]) { 
        [self.slidingViewController resetTopView]; 
       } else { 
        MESMainNavViewController *mainNavController = [[MESMainNavViewController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"SettingsVC"]]; 

        __weak typeof(self) weakSelf = self; 

        [self.slidingViewController anchorTopViewOffScreenTo:ECRight animations:nil onComplete:^{ 
         CGRect frame = self.slidingViewController.topViewController.view.frame; 
         self.slidingViewController.topViewController = mainNavController; 
         self.slidingViewController.topViewController.view.frame = frame; 
         [weakSelf.slidingViewController resetTopViewWithAnimations:nil onComplete:^{ 
          [weakSelf updateCurrentCell]; 
         }]; 
        }]; 
       } 

В настоящее время все работает нормально. У меня проблема с логином. Если пользователь выйдет из другого стека навигации, то будет нажата модально. Как только пользователь завершит успешный вход в систему, будет сделано уведомление. Это принимается Initial View Controller (сверху):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didLoginUser) name:@"LoginCompleteNotification" object:nil]; 

Способ затем обрабатывает нажатия пользователя на новый экземпляр подклассов контроллера навигации в вопросе, с домашнем контроллером как корень.

// If the view controller is not home send them to home 
UINavigationController *navController = (UINavigationController *)self.topViewController; 
UIViewController *VC = navController.topViewController; 
if (![VC isKindOfClass:[MESHomeViewController class]]) { 
    UIStoryboard *storyboard; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
     storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
    } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; 
    } 

    MESMainNavViewController *mainNavController = [[MESMainNavViewController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"HomeVC"]]; 

    self.topViewController = mainNavController; 
    [self resetTopView]; 

} 

Проблема, как представляется, со следующей частью:

MESMainNavViewController *mainNavController = [[MESMainNavViewController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"HomeVC"]]; 

self.topViewController = mainNavController; 

Когда этот новый экземпляр навигационного контроллера создается метод делегата willShowViewController не появляется называться? Я не могу понять, почему, он вызывает это, когда контроллер изменен через представление таблицы меню, и он использует тот же метод для создания любых мыслей?

ответ

1

яблоке Docs утверждает, что

Протокол UINavigationControllerDelegate определяет методы навигационный контроллер делегат может реализовать, чтобы изменить поведение когда контроллеры ракурса толкали и извлекаются из стека навигационного контроллера с.

Итак, я думаю, что метод willShowViewController будет вызываться только в том случае, если вы нажмете или поместите контроллер вида в/из стека навигации.

+0

Согласен, но поскольку новый экземпляр контроллера навигации создается, он нажимает контроллер. Когда система меню работает над кодом в вопросе, каждый раз, когда создается новый экземпляр и вызывается метод push. Он просто не отображается во второй части? – StuartM

+0

Да, я дважды проверял, и кажется, что 'initWithRoot' толкает контроллер представления в стек, но я не уверен, что это нажатие вызовет методы делегатов. Еще одна вещь, которая приходит мне на ум, где вы устанавливаете делегат контроллера навигатора? – danypata

+0

uinavigationcontroller - это собственный делегат, в настоящее время он установлен в viewDidLoad MESMainNavViewController – StuartM

Смежные вопросы