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

У меня есть контроллер табличного представления, 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

[self.navigationController popViewControllerAnimated:NO];

Вы можете делать то, что вы хотите с помощью следующего кода. Во-первых, вы 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+.

Другие вопросы по тегам