Программно меняющийся вид в ECSlidingViewController
Я пытаюсь программно изменить выбранный пункт меню и отображаемый topViewController. Другими словами, я пытаюсь сделать то же самое, что и изменить выбранную вкладку в UITabBarController:
[self.tabBarController setSelectedIndex:2];
Поэтому, согласно другому вопросу SO ( /questions/6787125/ecsslidingviewcontroller-kak-programmno-perejti-k-opredelennomu-vidu/6787130#6787130), я использую это для изменения отображаемого topViewController:
[self.slidingViewController anchorTopViewToRightAnimated:NO];
self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
[self.slidingViewController resetTopViewAnimated:NO];
Но это не работает. Итак, две первые строки работают правильно, отображая меню и изменяя topViewController, соответственно, но последняя строка просто не скрывает боковое меню, поэтому оно остается там до тех пор, пока я не скрою его жестом или не нажму кнопку. Отладка показывает, что последний self.slidingViewController
возвращается nil
вместо экземпляра ECSlidingViewController. И если я пропущу первую и последнюю строку, оставляя только:
self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
это приводит к сбою приложения.
Есть идеи, как правильно изменить вид, скрыв боковое меню? Я использую ECSlidingViewController 2.0.1
РЕДАКТИРОВАТЬ: использование блока соревнования и / или создание ссылки на контроллер скользящего вида не имеет никакого значения:
ECSlidingViewController *slidingViewController = self.slidingViewController;
[slidingViewController anchorTopViewToRightAnimated:NO onComplete:^{
slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
[slidingViewController resetTopViewAnimated:NO];
}];
ОБНОВЛЕНИЕ 14.7.2014:
Боковое меню не скрывается, только если используются пользовательские переходы контроллера вида. Например, в примере TransitionFun.
Приложение аварийно завершает работу, оставляя только следующее в обработчике перехода:
- (IBAction)unwindModalView:(UIStoryboardSegue *)sender
{
ECSlidingViewController *slidingViewController = [self slidingViewController];
slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"METransitionsNavigationController"];
}
ПРИМЕЧАНИЕ. Если последний контроллер представления (из которого вызывается sewind) вызывается push segue вместо модального перехода, приложение не завершается сбоем.
Вы можете увидеть иерархию контроллеров представления на изображении здесь
(это в основном пример TransitionFun с еще одним VC, инкапсулированным в NavigationVC и модально представленным segue из ячейки настроек)
3 ответа
После некоторых дальнейших исследований я обнаружил, что контроллер вид сверху (MyViewController
) свойство presentingViewController возвращает экземпляр ECSlidingViewController
вместо MESettingsViewController
хотя это был MESettingsViewController
который представил MyViewController
модально.
И потому что это ECSlidingViewController
это фактически представляет модальное представление, обработчик раскрутки не работал, потому что он оставил модальное представление на экране.
Решение:
Забудьте про раскручивающиеся сегменты, используйте следующий код в модально представленном контроллере вида сверху (MyViewController
) чтобы изменить свойство topViewController в ECSlidingViewController:
- (IBAction)switchToTransitionsScreen:(id)sender
{
self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"METransitionsNavigationController"];
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
Или используйте шаблон делегата и поместите его в MESettingsViewController
, например.
self.slidingViewController
является вычисляемой переменной. Расчет выполняется путем навигации по иерархии контроллера представления. Таким образом, если контроллер представления удален из иерархии как часть ваших изменений, то self.slidingViewController
перестанет работать.
Также очень неэффективно продолжать называть это. Изменить на:
ECSlidingViewController *slidingController = self.slidingViewController;
[slidingController anchorTopViewToRightAnimated:NO];
slidingController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
[slidingController resetTopViewAnimated:NO];
В случае, если кто-то не нашел ответа, я сделал это таким образом.
1- #import "UIViewController + ECSlidingViewController.h" в ваш menuViewController 2- Установите для stroboardID вашего destinationViewController значение "someID" 3- При запуске какого-либо действия в бэкэнде используйте этот код:
if(self.slidingViewController.currentTopViewPosition == ECSlidingViewControllerTopViewPositionCentered){
[self.slidingViewController anchorTopViewToRightAnimated:YES];
}
else{
self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"someID"];
[self.slidingViewController resetTopViewAnimated:YES];