Использование pushViewController после presentModalViewController - PullRequest
6 голосов
/ 10 марта 2010

В моем приложении в качестве корневого контроллера используется BaseViewController (NavigationController). Я обычно использую следующий код для навигации:

[self.navigationController pushViewController:childController animated:YES];

Но на одном из действий я хочу, чтобы следующий вид анимировал кнопку сверху, поэтому я использую:

[self presentModalViewController:childController animated:YES];

Пока все работает. В модальном представлении я хочу нажать еще один контроллер, но это, похоже, не работает. Я пробовал следующее:

// self.navigationController is null, so this doesn't work
[self.navigationController pushViewController:childController animated:YES];

// self.parentViewController is the BaseViewController and not null, but this 
// won't work either. This also generates a warning "UIViewController' may not 
// respond to '-pushViewController:animated:"
[self.parentViewController pushViewController:childController animated:YES];

В обоих случаях ничего не происходит. PushViewController отключен, пока модальное представление все еще показывает? Если так, есть ли другой способ, которым я могу:

  1. Анимация следующего контроллера снизу вверх
  2. Анимируйте следующий контроллер слева направо, как обычно, кнопкой возврата. Кнопка «Назад» должна вернуть вас к предыдущему (модальному) виду.

Ответы [ 4 ]

4 голосов
/ 10 марта 2010

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

1 голос
/ 24 мая 2013

Используйте следующие строки кода для представления childController, тогда навигационный контроллер не будет иметь значение null, поэтому он будет работать так, как вы хотите.

UINavigationController * childNavigationController = [[UINavigationController alloc] initWithRootViewController:childController];
childNavigationController.navigationBarHidden = YES;//if u want to show navigation bar then remove this line
[self.navigationController presentModalViewController:coinsNavigationController animated:YES];

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

// self.navigationController in this case will never be null. so following line will work perfectly inside presented child View controller (childController)
[self.navigationController pushViewController:childController animated:YES];

Вот желаемый результат:

  1. childController будет представлен через анимацию снизу вверх над BaseViewController
  2. Другой экземпляр дочернего контроллера будет выталкиваться через анимацию слева направо через childController.

Надеюсь, это будет полезным и простым решением.

0 голосов
/ 01 декабря 2011

Используя следующий метод, вы сначала представляете childViewController модально с помощью animated: YES, затем отклоняете его без какой-либо анимации и затем помещаете его в контроллер представления без анимации. Вам нужно будет создать собственную панель навигации для этого вида и скрыть панель навигации контроллера навигации.

        [self presentModalViewController:childController animated:YES];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
            sleep(1);

            dispatch_async(dispatch_get_main_queue(), ^{
                [self dismissModalViewControllerAnimated:NO];
                [self.navigationController pushViewController:childController animated:NO];
            });
        });

В childController при нажатии кнопки отмены:

if (self.navigationController != nil) {
    if ([delegate respondsToSelector:@selector(didDissmissSearchViewController)]) {
        [self.navigationController popViewControllerAnimated:NO];
        [delegate didDissmissChildViewController];
    }
    else {
        [self.navigationController popViewControllerAnimated:NO];
    }
}

и в делегате:

- (void)didDissmissSearchViewController { [self presentModalViewController:childController animated:NO]; [self dismissModalViewControllerAnimated:YES]; }

0 голосов
/ 10 марта 2010

Это может быть полезно: Базовая анимация - Листовое скольжение окна

Если вы используете это вместе с [self.navigationController pushViewController:childController animated:NO]; для отключения нативной анимации, это может привести к тому эффекту, который вы ищете.

Не забудьте отменить операцию при выталкивании childController из стека навигации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...