Промежуточный контроллер представления кратко показывает после отклонения модального представления затем выталкивающий контроллер представления
У меня есть контроллер табличного представления, A, который выполняет push-переход к контроллеру представления, B. Затем B выполняет модальный переход к контроллеру представления C. У меня есть кнопка на C, которая должна привести к удалению C (который модальный, как указано) и ТАКЖЕ всплывающее окно B, так что мы возвращаемся к A. В C я обнаружил нажатие кнопки и использовал делегата для обратного вызова B, который затем отклоняет контроллер модального представления C, используя это:
[sender dismissViewControllerAnimated:NO completion:nil];
Затем B использует делегата для обратного вызова A, который извлекает B из стека, используя это:
[self.navigationController popViewControllerAnimated:YES];
Теперь все это работает, за исключением очень раздражающего факта, что я кратко вижу B во время всего этого, тогда как я хотел бы иметь возможность "выскочить" из C прямо назад в A, вообще не видя B, хотя и кратко. Я попробовал комбинации YES/NO для параметров Animated выше, а также попробовал popToRootViewControllerAnimated, но не повезло:-(
У кого-нибудь есть идеи?
4 ответа
Я собрал быстрый проект, и мне показалось, что он отлично работает, используя этот код:
[self dismissViewControllerAnimated:YES completion:nil];
// Just a coincidence that this is the presenting VC rather than a regular UIViewController I think.
UINavigationController *navController = (UINavigationController *)self.presentingViewController;
[navController popViewControllerAnimated:NO];
Это пример проекта на Github: https://github.com/MaxGabriel/iOSNavigationFlow
Вы можете делать то, что вы хотите с помощью следующего кода. Во-первых, вы popToRootViewController, который выводит контроллер B из стека, но не меняет представление, так как представление C работает. Затем вы добавляете представление контроллера навигации под представлением C, чтобы оно находилось в иерархии представлений, но не отображалось. Затем вы делаете анимацию, чтобы сдвинуть вид С вправо, и, наконец, вы отклоняете модальный контроллер вида. Я создал свойство nav для сокращения набора текста, но в этом нет необходимости. Этот код находится в модальном представлении контроллера.m
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.nav = (UINavigationController *)self.presentingViewController;
}
-(IBAction)goBackToRoot: (UIButton *) sender {
[self.nav popToRootViewControllerAnimated:NO];
[self.view.window insertSubview:self.nav.view belowSubview:self.view];
[UIView animateWithDuration:.6 animations:^{
self.view.frame = CGRectMake(330, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
[self.nav dismissViewControllerAnimated:NO completion:nil];
}];
}
В iOS 6, если вы используете раскручивающиеся сегменты, вы не получите такой любопытный эффект. В вашем контроллере представления, к которому вы хотите перейти назад, просто определите действие размотки:
- (IBAction)home:(UIStoryboardSegue *)segue
{
// if you need to do any UI update because we got an unwind segue
// back to this controller, do that here
}
Затем в представленном вами контроллере представления (и он может быть на несколько уровней ниже) можно выполнить переход от раскрутки, перетаскивая кнопку, которая инициирует переход к значку "выход" в доке сцены. Он будет автоматически проходить, идентифицировать и представлять контроллеры представления, которые выполняют действия по отмене, и представлять эти варианты выбора.
Чистый эффект в том, что вы можете перепрыгнуть через несколько модальных и навигационных контроллеров, и вы получите только один эффект анимации.
Опять же, это, к сожалению, только iOS 6+.