DismissViewController отклоняет два UIViewController

Я представляю точку зрения таким образом:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ContractDetailsViewController *contractDetailsViewController = [[ContractDetailsViewController alloc] init];
    contractDetailsViewController.client = self.client;
    contractDetailsViewController.contractId = [NSString stringWithFormat:@"%d", indexPath.row];

    [self presentViewController:[[UINavigationController alloc]initWithRootViewController:contractDetailsViewController] animated:YES completion:^{
    }];
}

После того, как представление появляется, я отклоняю это с:

- (void)close
{
    [self dismissViewControllerAnimated:YES completion:^{}];
}

Ошибка в том, что вид исчезает, вид, который был за ним, также исчезает сразу после.

2 ответа

Решение

Это может объяснить, что происходит с вашими контроллерами представления:

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

( источник)

Это означает, что если вы представляете контроллер представления A, затем просматриваете контроллер B, а затем вызываете dismiss на контроллере представления B, оба контроллера представления отклоняются (хотя только B с анимацией).

Если вы хотите управлять двумя различными иерархиями контроллеров представления, вы можете использовать второй контроллер навигации. Это означает, например, что вы должны представить новый контроллер навигации вместо контроллера представления A и сделать контроллер представления A корневым контроллером навигации. Затем вы можете нажать / вытолкнуть любой другой требуемый контроллер вида (B и т. Д.)

Согласно яблочной документации.

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

Если вы хотите добиться этой функциональности, просто добавьте UIViews в текущем виде и показать их модальным способом. Вы можете удалить их по одному.

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